php - Apache Mod_Rewrite 不断重定向

标签 php apache .htaccess redirect mod-rewrite

我正在尝试在本地 Windows 计算机(PHP、Apache 2.4)上设置一个站点,并且我的重定向规则正在创建无限循环。我不明白为什么。

我的主机文件:

127.0.0.1   learn.loc
127.0.0.1   www.learn.loc

我的 Apache httpd-vhosts.conf:

<VirtualHost *:80>
    DocumentRoot "C:\websites\learn"
    ServerName learn.loc
    ServerAlias www.learn.loc
    ErrorLog "logs/learn.loc-error.log"
    CustomLog "logs/learn.loc-access.log" common

    LogLevel alert rewrite:trace2

    #PHP SETTINGS
    php_value auto_prepend_file "C:\websites\learn\noop.php"
    php_value open_basedir "C:\websites\learn"
    php_value error_log "C:\websites\learn\php_error.log"

    <Directory "C:\websites\learn">
      Options Indexes FollowSymLinks
      AllowOverride All
      Require all granted
    </Directory>  
</VirtualHost>

.htaccess(位于C:\websites\learn)

RewriteEngine on
RewriteRule ^yii   /yii-v1/blog
RewriteRule ^yii/(.*)   /yii-v1/blog/$1

我尝试访问的网页位于C:\websites\learn\yii-v1\blog\index.php。当我输入 learn.loc/yii 时,网络浏览器会无限期重定向。 ModRewrite 跟踪显示:

[rid#1330178/initial] rewrite 'yii/blog/' -> '/yii/blog'
[rid#1330178/initial] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1330178/initial] internal redirect with /yii/blog [INTERNAL REDIRECT]
[rid#1331880/initial/redir#1] rewrite 'yii/blog' -> '/yii/blog'
[rid#1331880/initial/redir#1] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1331880/initial/redir#1] internal redirect with /yii/blog [INTERNAL REDIRECT]
[rid#1334a40/initial/redir#2] rewrite 'yii/blog' -> '/yii/blog'
[rid#1334a40/initial/redir#2] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1334a40/initial/redir#2] internal redirect with /yii/blog [INTERNAL REDIRECT]
[rid#1335b88/initial/redir#3] rewrite 'yii/blog' -> '/yii/blog'
[rid#1335b88/initial/redir#3] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1335b88/initial/redir#3] internal redirect with /yii/blog [INTERNAL REDIRECT]
[rid#1336e30/initial/redir#4] rewrite 'yii/blog' -> '/yii/blog'
...

请注意,请求 ID(第一列)不同,因此发生了某种无限递归,但我不明白为什么。没有 Apache 或 PHP 错误。

最佳答案

您必须将正则表达式模式锚定在 RewriteRule 中以避免此问题:

RewriteEngine on

RewriteRule ^yii/?$   /yii-v1/blog [L,NC]

RewriteRule ^yii/(.+)$ /yii-v1/blog/$1 [L,NC]

您的正则表达式模式 ^yii 匹配任何以 /yii 开头的 URI,并且由于您重写的 URI 也以 /yii 开头,因此它不断重写,直到 Apache mod_rewrite 模块达到 Apache 服务器级别设置的最大限制或默认情况下,即 10

可以使用以下指令在 Apache 配置中更改此限制:

RewriteOptions MaxRedirects=20

关于php - Apache Mod_Rewrite 不断重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45549836/

相关文章:

ruby-on-rails - 通过 .htaccess 配置 Phusion 乘客

java - Apache FOP 1.0 多线程 - 打开的文件太多 err24

php - 用 mod_rewrite 或像 PHP 这样的语言处理友好/干净/漂亮的 URL 更好吗?

.htaccess - .htaccess 中的重定向 301 导致 500 服务器错误(重定向到非 URL)

php - 仅在加载 WordPress 索引时显示 div 的简单函数

php - apache 用户无法运行 sox 命令

.htaccess - 使用 w2 而不是 www 的 URL 规范化?

php - 如何为 xsd :anyType 创建 soapvar 对象

php - 带有外键数据的 laravel json 输出

php - 在屏幕上提取 ZIP 的内容,但避免除文件名之外的额外信息