【发布时间】:2015-01-27 00:47:54
【问题描述】:
我有重定向到 www 的重写规则和重定向到 ssl 的重写规则。这是我想要的设置,除了我添加这个新条件之外,一切都运行良好:
RewriteCond %{REQUEST_URI} !^/new-review?.* [NC]
如果该条件为真,我不希望发生 ssl 重定向。我看到的问题是,当我这样做时,整个 url 重定向到 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 运行。
【问题讨论】:
-
首先,您已经将非 www 版本重写为 HTTPS——在这种情况下,您的 RewriteCond for /new-review 来得太晚了。而且 RewriteCond 只会影响其后的 RewriteRule,因此您的最后一条规则不依赖于当前设置中对
!^/new-review?.*的条件检查。 -
但是假设他们输入的网址是“http://www example.com/new-review?query=string”,那么第一个条件将失败并且什么都不会发生,第二个条件应该失败只要文件或目录 new-review 不存在,什么都不会发生,并且第三个条件应该总是发生。似乎 index.php 的最后一个 RewriteRule 正在发送外部重定向,而不是仅在内部重写请求。
标签: .htaccess mod-rewrite