强制用户通过 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,请考虑使用您的网络服务器来强制执行该要求。例如 Apachemod_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吗? 是的。重点是,&lt;a&gt; 元素不关心它是否是 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 访问我的页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制运行 swf 文件,而不是下载

在 Laravel 8 中阻止 http 访问

将一页重定向到 http 而不是 https

开启HSTS让浏览器强制跳转HTTPS访问

强制spring hateoas生成https链接而不是http

如何强制https