我的网站启用了HTTPS ,所有网页均使用仅限HTTPS 提供。客户现在有条件要求将about-us
,termsofus
等静态网页显示为HTTP网页,而不是HTTPS 。这意味着即使用户尝试以HTTPS格式打开about-us
页面,也应该重定向到about-us
的HTTP版本。
我的.htaccess
代码如下:
Options -Indexes
<IfModule mod_rewrite.c>
RewriteEngine on
#RewriteCond %{HTTPS} off
#RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^\/about-us
RewriteCond %{REQUEST_URI} !^\/termsofus
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} \/about-us [OR]
RewriteCond %{REQUEST_URI} \/termsofus
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
</IfModule>
问题:每当我打开about-us
页面的HTTP / HTTPS版本时,它都会继续将我重定向到index.php
。
例如:https://example.com/about-us
到https://example.com/index.php
该网站使用PHP YII框架。
答案 0 :(得分:2)
使用THE_REQUEST
变量代替REQUEST_URI
。 THE_REQUEST
变量表示Apache从您的浏览器收到的原始请求,并且在执行某些重写规则后不会被覆盖。
Options -Indexes
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{THE_REQUEST} !\s/+(about-us|termsofus) [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
RewriteCond %{HTTPS} on
RewriteCond %{THE_REQUEST} \s/+(about-us|termsofus) [NC]
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
确保在测试此更改之前清除浏览器缓存。
答案 1 :(得分:1)
例如:
https://example.com/about-us
到https://example.com/index.php
请求https://example.com/about-us
:
这符合您的第二条规则(HTTPS为&#34; on&#34;请求about-us
)并重定向到http://example.com/about-us
(即返回HTTP)。
重定向的请求(即http://example.com/about-us
)现在与最后一条规则匹配,并且在内部重写到index.php
(前端控制器)。
但是,在每个目录.htaccess
个文件(目录上下文)&#34;重写的请求将被传回URL解析引擎&#34;并且该过程有效地重新开始。 REQUEST_URI
服务器变量也会更新以保存重写的URL,即。 /index.php
。
在第二次通过.htaccess
文件时,请求(现在重写为http://example.com/index.php
)与您的第一条规则匹配(HTTPS为&#34;关闭&#34;请求不是/about-us
或/termsofus
)因此请求重定向(第二次)到https://example.com/index.php
。 (内部重写有效地更改到外部重定向。)
重定向的请求(现在为https://example.com/index.php
)与.htaccess
文件中的任何规则都不匹配,因此传递不变。页面已送达。
如果您检查网络流量,您应该会看到上面提到的两个外部重定向。
另一种可能的解决方案是在最后END
上使用RewriteRule
标志(仅限Apache 2.4+)。这有效地结束 URL重写过程,因此该过程在步骤#2停止。虽然我仍然赞成anubhava的解决方案并反而检查THE_REQUEST
,这适用于Apache 2.2,如果你引入额外的重写,它仍然可以工作。