强制用户通过 HTTPS 而不是 HTTP 访问我的页面?
Posted
技术标签:
【中文标题】强制用户通过 HTTPS 而不是 HTTP 访问我的页面?【英文标题】:Force users to access my page over HTTPS instead of HTTP? 【发布时间】:2012-11-02 08:55:07 【问题描述】:跟进此处发布的问题:
How can I force users to access my page over HTTPS instead of HTTP?
我已将以下代码添加到一个页面,即我的 CART 目录的 index.php 页面。
if($_SERVER["HTTPS"] != "on")
header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
exit();
当我从索引页面开始浏览网站时,CART 目录中的所有文件都通过 HTTPS 加载(我真正想要的),但是如果我单击指向 CART 文件夹之外另一个页面的链接,它会返回到HTTP。
这是如何工作的?对于 CART 目录中的页面,HTTPS 如何保持活动状态?如果我为 CART 目录中的页面键入 URL,则不会强制执行 HTTPS,这是有道理的。
网站网址是http://wtc.betaforming.com
我想尽办法解决这个问题,谢谢。
布雷特
【问题讨论】:
当您将鼠标悬停在链接上时,您确定href
属性中写入了https://
吗?如果您只在索引页面中包含该脚本,则某人可能会在没有 https 的情况下导航到另一个页面。
对于 CART 目录中的文件,它们正在通过 HTTPS。如果我在 CART 目录页面中单击主导航中的链接,我会离开 HTTPS。如果我输入页面的 URL(不是 CART 目录中的 index.php 页面),则没有 HTTPS。我试图了解从 index.php 页面浏览到 CART 目录中的其他页面时如何/为什么强制执行 HTTPS。
【参考方案1】:
<?php
// Require https
if ($_SERVER['HTTPS'] != "on")
$url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
header("Location: $url");
exit;
?>
尝试将此添加到您尝试以 HTTPS 访问的文件中,它将强制浏览器以 HTTPS 加载。
【讨论】:
【参考方案2】:你回答了你自己的问题在你的问题:
这是如何工作的? CART 目录中的页面如何保持 HTTPS 处于活动状态?
...当你说:
我已将以下代码添加到一个页面,即我的 CART 目录的 index.php 页面。
看到了吗?您正在对购物车目录中的页面执行 HTTPS 要求,而不是在其他地方。这反映了您在网站上看到的内容。如果您想在站点范围内要求 HTTPS,请考虑使用您的网络服务器来强制执行该要求。例如 Apache
和 mod_rewrite
你可以试试这样的:
<IFModule mod_rewrite.c>
RewriteEngine on
RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI
</IFModule>
编辑
在您帖子的评论中,您说“我试图了解从 index.php 页面浏览到 CART 目录中的其他页面时如何/为什么强制执行 HTTPS”。我的猜测(这是一个猜测,因为您没有向我们展示您的代码)是这些 URL 是以与 ssl 无关的方式构建的,如下所示:
<a href="/cart/some_page.html">I'm SSL-enabled on a page with HTTPS in the address bar</a>
同样,如果没有看到您的代码,这是不可能的。
干杯
【讨论】:
我只将 PHP 代码放在一个页面上,CART 目录中没有其他页面。 你的意思是“ssl-agnotic”的root relative吗? 是的。重点是,<a>
元素不关心它是否是 https,它会以任何请求它所在页面的方式进行格式化。【参考方案3】:
我建议将这段代码添加到根目录中的 .htaccess 文件(如果您正在运行 Apache)中。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %HTTPS =off
RewriteRule ^DIRECTORY1|DIRECTORY2|DIRECTORY3 https://%HTTP_HOST%REQUEST_URI [R=301,L]
RewriteCond %HTTPS =on
RewriteCond %REQUEST_URI !^/DIRECTORY1|DIRECTORY2|DIRECTORY3
RewriteRule .* http://%HTTP_HOST%REQUEST_URI [R=301,L]
</IfModule>
将 DIRECTORY1、DIRECTORY2 等替换为要强制启用 HTTPS 的目录,然后反向执行(下面的代码),如果不是 DIRECTORY1、DIRECTORY2 等,则重定向到 HTTP。
希望对你有帮助
【讨论】:
您确定 op 正在使用 Apache?如果是这样,您不认为您应该检查是否启用了 mod_rewrite 吗? 很好地调用了 mod_rewrite。我假设所有服务器都像我的一样设置:/ 快速浏览 PHP 源代码表明只有 NSAPI 和 ISAPI SAPI 模块设置了变量“HTTPS”。 OP 似乎有某种决斗设置,可能是由于缺少 CART 所需的关键扩展。该站点的其余部分可能使用 Apache SAPI,这就是它不重定向的原因——触发器变量不存在。 ???我不知道这一切是什么。双设置?暂存站点托管在 RS Cloud 上。 CART 目录的关键扩展?以上是关于强制用户通过 HTTPS 而不是 HTTP 访问我的页面?的主要内容,如果未能解决你的问题,请参考以下文章