【发布时间】:2020-09-03 04:09:00
【问题描述】:
它陷入无休止的重定向循环。如果在最后一个 RewriteRule 我使用 END 而不是 L 它按预期工作。为什么它会这样,还有其他方法可以解决吗?
RewriteEngine on
#remove tailing slashes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/+$ /$1 [R,L]
#external redirect: /page.php to /page
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)\.php$ /$1 [R,L]
#internal redirect: page to page.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*?)$ $1\.php [L]
我的 Apache 版本是 2.4.43
解决方案:
我想我现在明白到底发生了什么。 Mod_rewrite 仅适用于一个版本的 URI,并且当我使用 R 标志时,更改仅在浏览器中可见。这与@anubhava 的回答一起导致了无休止的重定向循环。换句话说,我认为RewriteRule ^(.*)\.php$ /$1 [R,L] 和RewriteRule ^(.*?)$ $1\.php [L] 实际上并不适用于相同版本的 URI。
R 标志说明: https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_r
【问题讨论】:
-
您的最后一条规则
RewriteRule ^(.*?)$ $1\.php [L]会将任何网址重定向到该网址+.php。因此,您将获得如下所示的 url:index.php.php.php.php.php.php.php.php.php,并且该 URL 将继续无限地重写自身。[L]标志并不意味着这应该是执行的最后一条规则。这意味着这是在回到起点并重新开始之前执行的最后一条规则。 -
你的 Apache 版本是多少?
-
RewriteCond %{REQUEST_FILENAME}\.php -f没有帮助吗? -
Apache 2.4.43-1
标签: apache .htaccess redirect mod-rewrite web-development-server