无法使用 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>

这里有几个问题...

您的 &lt;Location&gt; 块匹配 /reports/(带有尾部斜杠),但您的 RewriteRule 模式 ^/reports$ 省略了尾部斜杠,因此它永远不会匹配。

&lt;Location&gt; 块很晚才合并,在这种情况下,RewriteRule pattern 匹配绝对文件系统路径,而不是根相对 URL 路径。

所以为了匹配请求,RewriteRule pattern 应该类似于/reports/$,以允许使用绝对文件系统路径,例如。 /path/to/document-root/reports/。换句话说:

 RewriteRule /reports/$ /reports/?%1%2 [R=302,NE,L]

或者,完全省略RewriteRule 模式 的路径组件(例如,简单地^),除非您只能匹配/reports/ 而不是/reports/&lt;anything&gt;

但是,您不应该在 &lt;Location&gt; 块中使用 mod_rewrite 指令。来自Apache 2.4 docs on the RewriteRule directive:

尽管&lt;Location&gt;&lt;Files&gt; 部分(包括它们的正则表达式对应项)在语法上允许重写规则,但这绝不是必要的,并且不受支持。在这些情况下可能会破坏的一个特征是相对替换。

这里没有使用RewriteBase 指令。 (但在 目录 上下文之外不支持/不需要它。)

RewriteRule pattern&lt;Location&gt; 指令执行相同的检查。将这些 mod_rewrite 指令移到 &lt;Location&gt; 容器之外,并将它们直接放在 &lt;VirtualHost&gt; 容器(或 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 无法重启问题解决方法

无法使用 apache http 服务器中 Location 标记中的上下文路径删除 url 中的空参数

无法向 Apache 服务器发出 http2 请求,尽管服务器在响应标头中发送“升级:h2”

Centos7安装Apache Http服务器无法访问如何解决

启动项目报错:502 Server dropped connection The following error occurred while trying to access http://loc

更改网址后无法打开 WordPress 网站