无法使用 apache http 服务器中 Location 标记中的上下文路径删除 url 中的空参数
Posted
技术标签:
【中文标题】无法使用 apache http 服务器中 Location 标记中的上下文路径删除 url 中的空参数【英文标题】:Unable to remove empty parameters in url using context path in Location tag in apache http server 【发布时间】:2021-11-25 13:21:24 【问题描述】:如果没有上下文路径设置,空参数会按预期正确删除,
以下是带有上下文路径的示例,其中未删除空参数(问题陈述)
<Location /reports/>
LogLevel alert rewrite:trace8
RewriteEngine On
RewriteBase /
ProxyPass http://1.2.3.4:3000/
ProxyPassReverse http://1.2.3.4:3000/
RewriteCond %QUERY_STRING ^(.+?&)?[^=]+=(?:&(.*))?$
RewriteRule ^/reports$ /reports/?%1%2 [R=302,NE,L]
</Location>
下面是没有上下文路径的例子,其中空参数按预期移除(但最终的解决方案需要使用上下文路径)
<Location />
ProxyPass http://1.2.3.4:3000/
ProxyPassReverse http://1.2.3.4:3000/
RewriteEngine On
AllowOverride All
RewriteCond %QUERY_STRING ^(.+?&)?[^=]+=(?:&(.*))?$
RewriteRule ^ %REQUEST_URI?%1%2 [R=302,NE,L]
</Location>
如何使用位置中的上下文路径设置从 URL 中删除空参数?
【问题讨论】:
【参考方案1】:<Location /reports/> : RewriteEngine On RewriteBase / : RewriteCond %QUERY_STRING ^(.+?&)?[^=]+=(?:&(.*))?$ RewriteRule ^/reports$ /reports/?%1%2 [R=302,NE,L] </Location>
这里有几个问题...
您的 <Location>
块匹配 /reports/
(带有尾部斜杠),但您的 RewriteRule
模式 ^/reports$
省略了尾部斜杠,因此它永远不会匹配。
<Location>
块很晚才合并,在这种情况下,RewriteRule
pattern 匹配绝对文件系统路径,而不是根相对 URL 路径。
所以为了匹配请求,RewriteRule
pattern 应该类似于/reports/$
,以允许使用绝对文件系统路径,例如。 /path/to/document-root/reports/
。换句话说:
RewriteRule /reports/$ /reports/?%1%2 [R=302,NE,L]
或者,完全省略RewriteRule
模式 的路径组件(例如,简单地^
),除非您只能匹配/reports/
而不是/reports/<anything>
。
但是,您不应该在 <Location>
块中使用 mod_rewrite 指令。来自Apache 2.4 docs on the RewriteRule
directive:
尽管
<Location>
和<Files>
部分(包括它们的正则表达式对应项)在语法上允许重写规则,但这绝不是必要的,并且不受支持。在这些情况下可能会破坏的一个特征是相对替换。
这里没有使用RewriteBase
指令。 (但在 目录 上下文之外不支持/不需要它。)
RewriteRule
pattern 和 <Location>
指令执行相同的检查。将这些 mod_rewrite 指令移到 <Location>
容器之外,并将它们直接放在 <VirtualHost>
容器(或 server 上下文)中。例如:
LogLevel alert rewrite:trace8
RewriteEngine On
RewriteCond %QUERY_STRING ^(.+?&)?[^=]+=(?:&(.*))?$
RewriteRule ^/reports/$ /reports/?%1%2 [R=302,NE,L]
<Location /reports/>
ProxyPass http://1.2.3.4:3000/
ProxyPassReverse http://1.2.3.4:3000/
</Location>
【讨论】:
谢谢@MrWhite。我试过这个配置,同样的问题仍然存在。当我使用带有多个参数(包括一个空白参数)的上下文路径 /reports/ 访问报告 url 时,不会在 url 中删除空参数。只有在我指定没有任何上下文路径的位置标记时,才会删除空参数。 @AmitSanghavi 你到底把这些指令放在哪里? @AmitSanghavi 另外请举例说明您请求的 URL(参数为空)。以上是关于无法使用 apache http 服务器中 Location 标记中的上下文路径删除 url 中的空参数的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 apache http 服务器中 Location 标记中的上下文路径删除 url 中的空参数
无法向 Apache 服务器发出 http2 请求,尽管服务器在响应标头中发送“升级:h2”
Centos7安装Apache Http服务器无法访问如何解决
启动项目报错:502 Server dropped connection The following error occurred while trying to access http://loc