【问题标题】:Force users to access my page over HTTPS instead of HTTP?强制用户通过 HTTPS 而不是 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。

标签: php ssl


【解决方案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吗?
    • 是的。重点是,&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 目录的关键扩展?
    猜你喜欢
    • 2010-09-10
    • 2015-02-09
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2017-04-07
    • 2014-08-12
    相关资源
    最近更新 更多