当前位置:  开发笔记 > 编程语言 > 正文

如何强制用户通过HTTPS而不是HTTP访问我的页面?

如何解决《如何强制用户通过HTTPS而不是HTTP访问我的页面?》经验,为你挑选了9个好方法。

我只有一个页面,我想强制作为HTTPS页面访问(Apache上的PHP).如何在不使整个目录需要HTTPS的情况下执行此操作?或者,如果您从HTTP页面向HTTPS页面提交表单,它是通过HTTPS而不是HTTP发送的吗?

这是我的例子:

http://www.example.com/some-page.php

我希望它只能通过以下方式访问:

https://www.example.com/some-page.php

当然,我可以把这个页面的所有链接指向HTTPS版本,但这并不能阻止一些傻瓜故意通过HTTP访问它...

我想到的一件事是在PHP文件的标题中放置一个重定向来检查以确保它们正在访问HTTPS版本:

if($_SERVER["SCRIPT_URI"] == "http://www.example.com/some-page.php"){
  header('Location: https://www.example.com/some-page.php');
}

但这不是正确的方法,可以吗?

顺便说一句,请不要注意URL.我知道如果它实际上是一个有购物车等的页面,你会以不同的方式做到这一点.您可以将其视为一个网站,该网站以一个价格销售一件商品,您可以在其中输入您的信用卡信息,然后将其提交到外部网站上的支付网关,以便明确向您的卡收费一次.



1> Adam Rosenfi..:

我以前做过的方式基本上就像你写的那样,但没有任何硬编码的值:

if($_SERVER["HTTPS"] != "on")
{
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    exit();
}


将if改为`(空($ _ SERVER ["HTTPS"])|| $ _SERVER ["HTTPS"]!=="on")`来修复PHP通知.
您忘记调用exit()以确保脚本在重定向后退出.我通常将它包装在一个名为requireSSL()的函数中.我可以在我要加密的任何页面的顶部调用它.
@ArianFaurtosh有些是从客户端头文件中提取的,比如`HTTP_X_FORWARDED`,可以操作,但其他像`HTTPS`或`SERVER_PORT`是直接从Web服务器设置的,*通常*应该是安全的.

2> thebigjc..:

您可以在Apache上使用指令和mod_rewrite来执行此操作:


RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

如果需要,您可以使用正则表达式使位置更智能.


你会把它放在哪里?.htaccess文件?
来自apache文档:REQUEST_URI请求的URI的路径组件,例如"/index.html".这显然排除了查询字符串,该字符串可用作名为QUERY_STRING的变量.因此,您需要在REQUEST_URI之后添加QUERY_STRING
您还需要在此之后添加[R] flage以使其重定向

3> Jacob Swartw..:

您应该强制客户端始终使用HTTP严格传输安全性(HSTS)标头请求HTTPS :

// Use HTTP Strict Transport Security to force client to use secure connections only
$use_sts = true;

// iis sets HTTPS to 'off' for non-SSL requests
if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    header('Strict-Transport-Security: max-age=31536000');
} elseif ($use_sts) {
    header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], true, 301);
    // we are in cleartext at the moment, prevent further execution and output
    die();
}

请注意,HSTS在大多数现代浏览器中都受支持,但不是通用的.因此,上述逻辑手动重定向用户,无论支持是否最终都在HTTP上,然后设置HSTS头,以便在可能的情况下应由浏览器重定向其他客户端请求.


仅供参考,标准RFC 6797第7.2节说"HSTS主机不得在通过非安全传输传输的HTTP响应中包含STS头字段".所以当请求是常规http时不需要发送它,如果浏览器遵循标准则应该忽略它.

4> 小智..:

我刚刚创建了一个.htaccess文件并添加了:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

简单!



5> 小智..:
// Force HTTPS for security
if($_SERVER["HTTPS"] != "on") {
    $pageURL = "Location: https://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    header($pageURL);
}



6> syvex..:

在负载均衡器后面运行时,不得不做这样的事情.帽子提示/sf/ask/17360801/

function isSecure() {
    return (
        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
     || $_SERVER['SERVER_PORT'] == 443
     || (
            (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
         || (!empty($_SERVER['HTTP_X_FORWARDED_SSL'])   && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
        )
    );
}

function requireHTTPS() {
    if (!isSecure()) {
        header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], TRUE, 301);
        exit;
    }
}



7> itsazzad..:

http://www.besthostratings.com/articles/force-ssl-htaccess.html

有时您可能需要确保用户通过安全连接浏览您的站点.使用包含以下行的.htaccess文件可以轻松地将用户重定向到安全连接(https://).

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

请注意,.htaccess应位于网站主文件夹中.

如果您希望为特定文件夹强制使用HTTPS,您可以使用:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} somefolder 
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L]

.htaccess文件应放在您需要强制HTTPS的文件夹中.



8> 小智..:

好的..现在这里有很多东西,但没有人真正完成"安全"问题.对我来说,使用不安全的东西是荒谬的.

除非你用它作诱饵.

$ _SERVER传播可以根据知道方法的人的意愿进行更改.

同样,Sazzad Tushar Khan和thebigjc表示你也可以使用httaccess来做这个,这里有很多答案包含它.

只需添加:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

到你的.httaccess所拥有的就结束了那就是那个.

我们仍然不如使用这两种工具那样安全.

其余的很简单.如果缺少属性,即......

if(empty($_SERVER["HTTPS"])){ // SOMETHING IS FISHY
}

if(strstr($_SERVER['HTTP_HOST'],"mywebsite.com") === FALSE){// Something is FISHY
}


还要说你已经更新了你的httaccess文件并检查:

if($_SERVER["HTTPS"] !== "on"){// Something is fishy
}

你可以检查更多变量,即...

HOST_URI (如果有静态属性要检查)

HTTP_USER_AGENT (相同会话的不同值)

因此,当答案在一个组合中时,我所说的一切都不会只是满足于一个或另一个.

有关更多httaccess重写信息,请参阅docs-> http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

此处的一些堆栈 - > 使用.htaccess和mod_rewrite强制SSL/https

获取完整的URL当前页面(PHP)
来命名一对.


但现在我收到以下错误:`ERR_TOO_MANY_REDIRECTS`.我该如何解决?

9> 小智..:

PHP方式:

$is_https=false;
if (isset($_SERVER['HTTPS'])) $is_https=$_SERVER['HTTPS'];
if ($is_https !== "on")
{
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit(1);
}

Apache mod_rewrite方式:

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有