【问题标题】:How do I force HTTPS on a single file? (PHP)如何在单个文件上强制使用 HTTPS? (PHP)
【发布时间】:2012-03-03 19:59:54
【问题描述】:

我有一个处理信用卡处理的 PHP 文件。它以输入信用卡号的表格开始,然后变成“确认”屏幕(显示信用卡号),然后再次处理并显示结果。所有三个加载都将通过 PHP 提交完成(我意识到确认可能比 Javascript 更好,但我没有编写它)。它是该目录中唯一处理信用卡的文件,因此它是唯一需要httpS连接的文件。

我尝试使用 $_SERVER 数组强制执行此操作,从 SCRIPT_URI(或其他条目)的前缀查找用于连接的协议,但没有前缀。

是否有一种简单的方法可以使用同一目录中的 .htaccess 文件执行此操作?我如何只对那个文件强制执行它?如果还有其他简单的方法,我该怎么做?

抱歉这些问题,但到目前为止我在这里的搜索还没有找到可行的解决方案,恐怕我不知道最佳做法是什么。

谢谢!

【问题讨论】:

标签: php .htaccess ssl https


【解决方案1】:

在执行所有信用卡处理的 PHP 页面的开头,您可以添加以下内容:

它将重定向回自身,除非它首先通过http 加载,否则使用https。当然,您仍然需要为您的域安装 SSL 证书。

if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) { // if request is not secure, redirect to secure url
    $url = 'https://' . $_SERVER['HTTP_HOST']
                      . $_SERVER['REQUEST_URI'];

    header('Location: ' . $url);
    exit;
}

我在 PHP 中使用相同的逻辑来保护我的整个域,方法是将其放入在我的站点的每个请求开始时始终调用的文件中。

【讨论】:

    【解决方案2】:

    首先,您为什么要故意让您的所有网站都使用不安全的协议?您是否真的有如此紧张的性能预算以至于无法承受 TLS 的开销?过早的优化是人类的祸根。

    此外,说信用卡处理脚本是唯一需要 HTTPS 的脚本意味着您的用户登录系统正在以明文形式发送密码。这不仅是性能贪婪,而且是彻头彻尾的糟糕设计。

    除此之外,正确的解决方案是使用mod_rewrite 强制将该链接重定向到 HTTPS。如果您根本无法操作服务器配置(即使通过.htaccess),另一种解决方案是让您的 PHP 脚本首先检查协议,如果不是 HTTPS,则发出重定向并终止。

    【讨论】:

    • 正如我所说,我知道有很多事情应该以不同的方式完成,但我无法控制改变所有需要完成的事情。只是试图从现在开始让事情变得最好,并在适当的时候鼓励回改。 “mod_rewrite”是您放入本地目录的 .htaccess 文件的解决方案吗?单个文件的语法是什么?否则,我怎样才能让 PHP 检查协议?我当然更愿意以正确的方式做,但正如我所说:我在这里没有完全的控制权。谢谢!
    【解决方案3】:

    将以下代码放入文件夹中的 .htacces 文件中:

    RewriteEngine On
    RewriteCond %{SERVER_PORT} !443
    RewriteRule (.*) https://www.example.com/require-secure/ [R]
    

    如果端口不是 443(443 用于 HTTPS)则触发并重定向到 https://www.example.com/require-secure/

    注意:mod_rewrite 是必需的,但大部分可用

    【讨论】:

    • O/P 要求提供一个 single 文件,因此规则模式类似于 RewriteRule ^secure-file$ https://www.example.com/secure-file [R=301] 也更传统地将条件基于 %{HTTPS} : -)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2015-06-25
    • 2015-01-08
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多