Mod Rewrite不按预期重定向

时间:2015-01-26 16:10:24

标签: .htaccess mod-rewrite

我有重写规则重定向到www并重写规则以重定向到ssl。这是我想要的设置,一切都很完美,除非我添加这个新条件:

RewriteCond %{REQUEST_URI} !^/new-review?.* [NC]

如果该条件为真,我不希望ssl重定向发生。我看到的问题是,当我这样做时,整个网址会重定向到https://www.example.com/index.php?query=string

即使是每个其他页面的正常行为都可以正常工作。 URI保持不变,但运行index.php。这是我的htaccess文件:

Options +FollowSymLinks -Indexes

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(?!www\.).*$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_URI} !^/new-review?.* [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

我的预期行为是url http://www.example.com/new-review?query=string中的某些类型,此页面在index.php上运行代码,而不将用户uri切换为index.php。我只是无法弄清楚为什么最后的重写规则:

RewriteRule . index.php
除了一个条件之外,

遵循预期的行为。我想要的只是这一页作为非ssl页面工作,但仍然通过index.php运行。

2 个答案:

答案 0 :(得分:2)

重要的诀窍是在您的情况下使用THE_REQUEST变量而不是REQUEST_URITHE_REQUEST变量表示Apache从您的浏览器收到的原始请求,在执行某些重写规则后不会被覆盖

所以你可以使用:

Options +FollowSymLinks -Indexes
RewriteEngine On

RewriteCond %{HTTP_HOST} ^(?!www\.).*$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{THE_REQUEST} !^\s/new-review [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

答案 1 :(得分:1)

重写引擎将循环,直到URI停止更改。请求/new-review时发生的情况是,它与任何重定向规则都不匹配,然后匹配最后一条规则并应用,因此/new-review会重写为/index.php。现在,重写引擎循环,并应用新的URI。这次,您的第二条规则与URI(/index.php)匹配,从而被重定向。如果你不希望index.php被重定向,那么你需要阻止所有循环,或者添加一个passthrough:

Options +FollowSymLinks -Indexes

RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteCond %{HTTP_HOST} ^(?!www\.).*$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_URI} !^/new-review?.* [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Options +FollowSymLinks -Indexes

RewriteEngine On

RewriteRule ^(index\.php)?$ - [L]

RewriteCond %{HTTP_HOST} ^(?!www\.).*$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_URI} !^/new-review?.* [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php