我有重写规则重定向到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运行。
答案 0 :(得分:2)
重要的诀窍是在您的情况下使用THE_REQUEST
变量而不是REQUEST_URI
。 THE_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