这是另一个.htaccess问题。我已经完成了文献综述。非常感谢任何帮助。

要求:

  1. 仅为几个网址强制使用HTTPS。
  2. 浏览器不应为SSL页面说明部分加密的页面
  3. 我正在使用CodeIgnitor并将 config.php 中的 base_url 调整为:

    $config['base_url'] = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') ? 'https://' : 'http://' ;
    $config['base_url'] .= $_SERVER['HTTP_HOST'];
    $config['base_url'] .= preg_replace('@/+$@','',dirname($_SERVER['SCRIPT_NAME'])).'/';
    

    因此,如果使用 https:// 访问URL,则其中包含的所有链接也将位于HTTPS上,这是为了避免<!>“;部分加密的页面<!>”;问题。

    我从以下htaccess代码开始:

    RewriteCond %{HTTPS} !on
    RewriteRule ^(.*)/(abc|xyz|pqr)(.*)$ https://%{HTTP_HOST}/cart/$2$3 [R=301,NC,L]
    
    RewriteCond %{HTTPS} on
    RewriteCond %{REQUEST_URI} !^(.*)/(abc|xyz|pqr)(.*)$ [NC]
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L]
    

    如果任何具有 abc 的网址, xyz pqr 将被重定向到HTTPS,任何没有它的网址都将被强制返回HTTP。

    这很好用,唯一的问题是它无法避免<!>“部分加密的页面<!>”;问题。例如,如果我去网址 http://www.example.com/abc/ index.php ,它将被重定向到 https: //www.example.com/abc/index.php 的。但是此页面上的链接说 https://www.example.com/images/ logo.png ,由于后一种重写规则,将更改为HTTP。从而使页面部分加密。

    我也试过像这样添加 http_referer 检查来解决这个问题,但显然不会解决这个问题。因为来自HTTPS页面的任何点击都不会转换为HTTP。

    RewriteCond %{HTTPS} !on
    RewriteRule ^(.*)/(abc|xyz|pqr)(.*)$ https://%{HTTP_HOST}/cart/$2$3 [R=301,NC,L]
    
    RewriteCond %{HTTPS} on
    RewriteCond %{HTTP_REFERER} !^(https)(.*)$
    RewriteCond %{REQUEST_URI} !^(.*)/(abc|xyz|pqr)(.*)$ [NC]
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L]
    

    只是想知道这个简单的问题是否有更好的方法,或者我是以错误的方式做到的。使用CI钩子而不是.htaccess会解决这个问题吗?

    提前致谢

有帮助吗?

解决方案 2

好的。我想我找到了解决方案。我在我的服务器上测试过它。工作良好 .. 在重写中也需要http referer条件

RewriteCond %{HTTPS} !on
RewriteRule ^(.*)/(abc|xyz|pqr)(.*)$ https://%{HTTP_HOST}/cart/$2$3 [R=301,NC,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_REFERER} !^https(.*)/(abc|xyz|pqr)(.*)$ [NC]
RewriteCond %{REQUEST_URI} !^(.*)/(abc|xyz|pqr)(.*)$ [NC]
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L]

现在,如果您访问任何带有(abc,xyz,pqr)的页面,它将被重定向到https:// ... 此外,所有嵌入式链接都将通过https提供。所以浏览器不会显示部分加密警告(状态栏上的红色警告标志)

当您离开这些页面的任何一个页面时,由于引用检查,该页面将在ssl上,并且此页面可能会显示部分加密的警告(但我可以使用它)。一旦你离开这个页面,一切都将是非ssl。

希望这有助于某人!!!

其他提示

您可以将静态内容放在不同的域上,例如 static.example.com ,并为此类请求禁用HTTPS to HTTP重定向。

使用//static.example.com/…引用该资源以使用与包含引用的文档相同的URI方案,并在RewriteRule中测试是否请求此类资源:

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !=static.example.com
RewriteRule !(^|/)(abc|xyz|pqr) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top