RewriteRule意外返回301

时间:2017-12-17 00:09:46

标签: apache mod-rewrite

我迷路了,我花了好几个小时研究这个简单的问题,无法弄清楚我在这里做错了什么。

这可以按预期工作:

RewriteEngine on
RewriteRule ^([A-Za-z0-9-_.]+)/([A-Za-z0-9-_.]+/)$ index.php?eins=$1&%{QUERY_STRING}&zwei=$2&%{QUERY_STRING} [L]

并重写此请求:https://domain.tld/asdf/asdf/ 内部https://domain.tld/index.php?eins=asdf&zwei=asdf 到目前为止一切都如预期的那么好。

但是如果我添加这个额外的第二条规则

RewriteEngine on
RewriteRule ^([A-Za-z0-9-_.]+)/([A-Za-z0-9-_.]+/)$ index.php?eins=$1&%{QUERY_STRING}&zwei=$2&%{QUERY_STRING} [L]
RewriteRule ^(.+[^/])$ /$1/ [R=301,L]

Apache使用301响应同一请求https://domain.tld/asdf/asdf/以重定向到https://domain.tld/index.php/?eins=asdf&&zwei=asdghi/

我预计第一个RewriteRule应该是L = Last,但为什么要重定向?实际上,如果缺少尾部斜杠,我想实现301重定向

1 个答案:

答案 0 :(得分:0)

检查RewriteRule Flags L|last

  

如果您在.htaccess文件或中使用RewriteRule    部分,重要的是要有一些了解   如何处理规则。简化形式就是这一次   规则已经处理,重写的请求被交还给   URL解析引擎可以用它做它可能做的事情。它可能是   当处理重写的请求时,.htaccess文件或   可能会再次遇到该部分,因此可以运行规则集   从一开始。最常见的情况是,如果其中之一   规则导致重定向 - 内部或外部 - 导致   请求流程重新开始。

如果您只想为目录添加尾部斜杠,可以尝试以下规则:

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !(.+)/$
RewriteRule ^(.*) $1/ [L,R=301]