Htaccess条件https用于静态页面

时间:2017-05-31 10:53:11

标签: php .htaccess yii

我的网站启用了HTTPS ,所有网页均使用仅限HTTPS 提供。客户现在有条件要求about-ustermsofus等静态网页显示为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-ushttps://example.com/index.php

该网站使用PHP YII框架。

2 个答案:

答案 0 :(得分:2)

使用THE_REQUEST变量代替REQUEST_URITHE_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)

anubhava的答案已经解决了问题并提供了一个很好的解决方案。我想我只是提供一些额外的解释,说明您所说的示例在参考原始代码时发生了什么:

  

例如:https://example.com/about-ushttps://example.com/index.php

请求https://example.com/about-us

  1. 这符合您的第二条规则(HTTPS为&#34; on&#34;请求about-us)并重定向到http://example.com/about-us(即返回HTTP)。

  2. 重定向的请求(即http://example.com/about-us)现在与最后一条规则匹配,并且在内部重写index.php(前端控制器)。

  3. 但是,在每个目录.htaccess个文件(目录上下文)&#34;重写的请求将被传回URL解析引擎&#34;并且该过程有效地重新开始。 REQUEST_URI服务器变量也会更新以保存重写的URL,即。 /index.php

  4. 在第二次通过.htaccess文件时,请求(现在重写为http://example.com/index.php)与您的第一条规则匹配(HTTPS为&#34;关闭&#34;请求不是/about-us/termsofus)因此请求重定向(第二次)到https://example.com/index.php。 (内部重写有效地更改外部重定向。)

  5. 重定向的请求(现在为https://example.com/index.php)与.htaccess文件中的任何规则都不匹配,因此传递不变。页面已送达。

  6. 如果您检查网络流量,您应该会看到上面提到的两个外部重定向。

    另一种可能的解决方案是在最后END上使用RewriteRule标志(仅限Apache 2.4+)。这有效地结束 URL重写过程,因此该过程在步骤#2停止。虽然我仍然赞成anubhava的解决方案并反而检查THE_REQUEST,这适用于Apache 2.2,如果你引入额外的重写,它仍然可以工作。