我迷路了,我在这个简单的问题上花了好几个小时,无法想象我在这里做错了什么。
这按预期工作:
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重定向。
检查RewriteRule Flags L|last
,
如果您在.htaccess文件或部分中使用RewriteRule,那么了解规则的处理方式非常重要。这种简化形式是,一旦处理了规则,重写的请求就会被传回URL解析引擎,以便对其进行处理。可能的是,当处理重写的请求时,可能再次遇到.htaccess文件或部分,因此可以从开始再次运行规则集。最常见的情况是,如果其中一个规则导致重定向(内部或外部)导致请求进程重新开始,则会发生这种情况。
如果您只想为目录添加尾部斜杠,可以尝试以下规则:
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !(.+)/$
RewriteRule ^(.*) $1/ [L,R=301]