强制 RewriteRule 在 htaccess 文件中结束处理/循环

Posted

技术标签:

【中文标题】强制 RewriteRule 在 htaccess 文件中结束处理/循环【英文标题】:Force RewriteRule to end processing/looping in htaccess file 【发布时间】:2020-10-21 06:21:18 【问题描述】:

昨天我发现我的服务器对不受支持的 HTTP 方法的响应不正确。如果不支持 HTTP 方法,您应该使用HTTP 405: Method Not Supported 进行响应。潘杜朗可以answer that question。

我已经阅读了大量关于 [L] 如何循环的文章,并且我花时间浏览了所有 Apache 2.4 flag documentation。

我尝试使用[L] 标志,然后使用[END] 标志。 我尝试在两个RewriteRule 集上以各种可能的方式组合标志(例如[L,R=405][END,R=405])。 我尝试了没有标志的组合。 我重新排列了规则的顺序。 我尝试在不相关的第二个 RewriteRule 之前添加 RewriteCond %REQUEST_METHOD ^(GET|POST)$。 我读了很多

以下是两组规则:

RewriteEngine On
RewriteCond %REQUEST_METHOD !^(GET|POST)$
RewriteRule .* - [R=405]

#Unrelated rule, when present, breaks the above HTTP 405 turning it in to an HTTP 302:
RewriteRule !\.(css|js|zip)$ index.php [L]

为了进行测试,我使用 cURL 运行了以下命令:

curl -X PUT -d arg=val -d arg2=val2 https://www.example.com/ -i

我知道 HTTP 405 代码通过 cURL 工作,因为我可以看到响应代码,只是 不是 当另一行存在并且我必须同时拥有两者时。一旦匹配规则,我需要做什么来强制 Apache 停止循环/处理?

【问题讨论】:

@anubhava 正如我已经提到的,不相关的规则(在底部)在被删除时允许 HTTP 405 正常工作。它们的相对位置、标志等都已调整,但我必须同时拥有不相关的 RewriteRule 和 this 以阻止不支持的方法。 很奇怪,因为我在本地 .htaccess 中复制粘贴完全相同的代码(也使用第二条规则),但我仍然得到 405 而不是 302 LiteSpeed 有时会与RewriteRule 混淆,但我只是确认它不在实时服务器上。我知道规则的顺序很重要,我完全不知所措。我还能尝试什么? 哦,我刚刚删除了几乎所有内容并将 405 代码放在不相关的下面,它工作了......现在我必须寻找某种组合,将在一分钟内更新......跨度> Jfyi:我在顶部有 405 规则,它在我的 Apache 2.4.43 上运行良好 【参考方案1】:

由于某种原因,新代码必须在底部,这没有任何意义,因为我想避免让 Apache 处理所有其他规则最终只这样做。

#Unrelated rule
RewriteRule !\.(css|js|zip)$ index.php [L]

#Rule that now works, only at the bottom
RewriteCond %REQUEST_METHOD !^(GET|POST)
RewriteRule .* - [R=405,L]

【讨论】:

以上是关于强制 RewriteRule 在 htaccess 文件中结束处理/循环的主要内容,如果未能解决你的问题,请参考以下文章

Apache环境修改.htaccess文件实现子目录强制HTTPS访问

强制www./no-www.in.htaccess

。htaccess对RewriteRule的帮助

在 htaccess 中使用 rewriterule 的页面 slug

.htaccess 中的 RewriteRule 在 app.yaml 文件中转换为啥?

.htaccess 重定向到 404 页面 RewriteRule