【问题标题】:Why this .htaccess rewrite code isn't redirecting properly?为什么这个 .htaccess 重写代码没有正确重定向?
【发布时间】: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


【解决方案1】:

标志LEND 的行为不同。 L 标志意味着再次运行重写循环(在 while 循环中就像 continue 一样),END 循环终止循环(在 while 循环中就像 break 一样)。

END 标志是在 Apache 2.4 中引入的,它用于防止您当前观察到的重写循环。

当您使用 L 时,您的最后一条规则在请求 uri 的末尾添加 .php 并且当重写循环再次运行时 #external redirect 规则从请求 uri 中删除 .php 然后最后一条规则再次添加 .php at请求 uri 的结尾。此循环继续并导致无限循环。为了防止这种情况,您可以在最后一条规则中使用 END 标志,该标志仅终止当前请求的 mod_rewrite 执行并防止循环行为。

Check: mod_rewrite ruleset processing

【讨论】:

  • 但我的最后一条规则只提供 .php 文件,它不会更改请求 URI,还是这样?我的每个重写块都可以正常工作,但是第二个和第三个的组合会产生错误。我知道 mod_rewrite 引擎在 .htaccess 文件中循环,我知道 END 和 L 标志的作用。
  • 它确实改变了请求 uri
  • 当我只测试最后一个代码块时,如果地址栏在浏览器中保持不变,它如何更改 URI?我认为更改 URI 会导致用户地址栏发生变化,还是 R(edirect) 标志的作用?
  • @HerculePoirot:请求 URI 不会在您的浏览器中更改,因为最后一条规则中没有外部重定向,但在内部它确实在 mod_rewrite 执行期间发生了更改。如果您启用RewriteLog,那么 Apache 将在应用每个规则之前记录它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多