mod-rewrite - htaccess(https 到 http)

标签 mod-rewrite codeigniter redirect https url-scheme

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

要求:

  1. 仅对少数网址强制使用 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 ,会因为后面的rewrite rule而改成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 钩子(Hook)而不是 .htaccess 会解决这个问题吗?

提前致谢

最佳答案

您可以将您的静态内容放在不同的域中,例如 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]

关于mod-rewrite - htaccess(https 到 http),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1818869/

相关文章:

apache - 使用 Apache Rewrite 从 HTTP 转到 HTTPS,反之亦然,但我收到 302 响应并且我的应用程序出错

codeigniter - 在 CodeIgniter 站点上的 Chrome 中获取 SSL 加密错误

wordpress - HTTP 到 HTTPS - 重定向太多

.htaccess - 如何将所有子目录重定向到域的根目录?

php - 哪种是按国家/地区重定向用户的最佳可扩展方式?

url - 如何使用 mod_rewrite 将查询字符串转换为路径 URL?

apache - Cloudfront CDN 到 Apache 源

.htaccess - 主域为 https,子域为 http

php - 如何防止重复记录?

codeigniter - 将函数的变量传递给 codeigniter Controller 中的其他函数?