强制 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访问
在 htaccess 中使用 rewriterule 的页面 slug