【问题标题】:htaccess (https to http)htaccess (https 到 http)
【发布时间】:2010-12-21 14:10:40
【问题描述】:

这是另一个 .htaccess 问题。我已经做了文献综述。将不胜感激。

要求:

  1. 仅对少数 URL 强制使用 HTTPS。
  2. 浏览器不应为 SSL 页面显示部分加密的页面

我正在使用 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]

这样,任何具有 abcxyzpqr 的 URL 都将被重定向到 HTTPS,任何没有它的 URL 都将被强制返回HTTP。

这很好用,唯一的问题是它无法避免“部分加密的页面”问题。例如,如果我选择 url 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 会解决这个问题吗?

提前致谢

【问题讨论】:

  • 我只是在问.. 你为什么不让用户信息保密?

标签: mod-rewrite codeigniter redirect https url-scheme


【解决方案1】:

您可以将静态内容放在不同的域中,例如 static.example.com,并为此类请求禁用 HTTPS 到 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]

【讨论】:

  • 在这种情况下,如果来自 example.com 的页面包含来自 static.example.com 的内容,浏览器会显示部分加密的页面
  • @shikhar:我澄清了我的声明。
【解决方案2】:

好的。我想我找到了解决方案。我也在我的服务器上测试了它。工作正常 .. 在重写中也需要一个 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(.*)/(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 的。

希望这对某人有帮助!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2016-04-23
    相关资源
    最近更新 更多