Apache ModRewrite保持重定向

时间:2017-08-07 14:50:59

标签: 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时,Web浏览器会无限期地重定向。 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错误。

1 个答案:

答案 0 :(得分:5)

您必须在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