Mod_rewrite:两个重写规则的奇怪行为

时间:2015-11-03 06:44:58

标签: php apache .htaccess symfony mod-rewrite

我配置了以下规则:

 <IfModule mod_rewrite.c>
                Options -MultiViews
                RewriteEngine On

                RewriteCond %{REQUEST_URI} !^/foo/bar.php
                RewriteCond %{HTTPS} !=on
                RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

                RewriteCond %{HTTP_HOST} ^(domain.com|www.domain.com)
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteRule ^(.*)$ web/app.php [QSA,L]
            </IfModule>

我希望使用HTTP的所有请求都被重定向到HTTPS,但特定路径除外:/foo/bar.php。

第二条规则将所有内容重定向到web / app.php脚本(Symfony2)。

现在一切正常,但当我查询http://domain.com/foo/bar.php时,我被重定向到https://domain/com/web/app.php

如果我查询https://domain/com/foo/bar.php,它的工作正常。

这对我没有任何意义,为什么我会被重定向到&#34; https://domain/com/web/app.php&#34; ?我错过了什么吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

在第一条规则中使用THE_REQUEST变量而不是REQUEST_URITHE_REQUEST变量表示Apache从您的浏览器收到的原始请求,并且在执行某些重写规则后不会被覆盖。

Options -MultiViews
RewriteEngine On

RewriteCond %{THE_REQUEST} !/foo/bar.php
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=302,L]

RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ web/app.php [QSA,L]