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

我只有一个页面,我想强制访问作为一个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文件的头部添加一个redirect,以确保他们正在访问HTTPS版本:

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

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

顺便说一句,请不要留意url。 我知道,如果它实际上是一个有购物车等的网页,那么你会以不同的方式去做。 把它看作是一个网站上的一个网站,它出售一个价格的一个项目,你input你的信用卡信息将被提交到外部网站上的支付网关,以便为你的卡充值一次。

我之前完成的方式基本上就像你写的,但没有任何硬编码的值:

  if($ _ SERVER [“HTTPS”]!=“on”)
 {
     header(“Location:https://”。$ _SERVER [“HTTP_HOST”]。$ _SERVER [“REQUEST_URI”]);
    出口();
 } 

你可以在Apache上使用指令和mod_rewrite:

 <Location /buyCrap.php> RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} </Location> 

如果需要,可以使用正则expression式使位置更加智能化。

您应该强制客户端始终使用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,但不是通用的。 因此,上述逻辑手动redirect用户,无论是否支持HTTP,然后设置HSTS头,以便进一步客户端请求应尽可能由浏览器redirect。

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

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

简单!

 // 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); } 

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

有时您可能需要确保用户通过安全连接浏览您的网站。 总是将用户redirect到安全连接(https://)的一种简单方法可以通过包含以下几行的.htaccess文件来完成:

 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的文件夹中。

在负载平衡器后面运行时,必须这样做。 帽子提示https://stackoverflow.com/a/16076965/766172

 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; } } 

好吧,现在这里有很多东西,但没有人真正完成“安全”的问题。 对我来说,使用不安全的东西是可笑的。

除非你用它作为诱饵。

$ _SERVER传播可以根据知道如何的人的意愿而改变。

也作为Sazzad Tushar汗和thebigjc说,你也可以使用httaccess来做到这一点,这里有很多答案包含它。

只需添加:

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

到你在.httaccess中的结尾,那就是。

尽pipe如此,我们还不能像这两种工具那样安全。

其余的很简单。 如果有缺less的属性,即…

如果(空($ _服务器[“HTTPS”])){//东西是鱼
}

if(strstr($ _ SERVER ['HTTP_HOST'],“mywebsite.com”)=== FALSE){//东西是鱼
}

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

if($ _ SERVER [“HTTPS”]!==“on”){// Something is fishy
}

有更多的variables,你可以检查ie ..

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

HTTP_USER_AGENT (相同的会话不同的值)

所以,我所说的是,当答案在于一个组合时,不仅仅是为了一个或另一个而定下来。

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

这里的一些堆栈 – > 使用.htaccess和mod_rewrite强制SSL / HTTPS

获取当前页面的完整URL(PHP)
要命名一对夫妇。

使用$_SERVER['HTTPS']来判断它是否为SSL ,如果不是则redirect到正确的位置。

请记住,显示表单的页面不需要通过HTTPS提供,它是最需要的回发url。

编辑 :是的,正如下面指出的,最好是在HTTPS中有整个过程。 这更让人放心 – 我指出这个职位是最关键的部分。 另外,您需要注意任何Cookie设置为安全的,因此只能通过SSL发送。 mod_rewrite解决scheme也非常漂亮,我用它来保护我自己的网站上的很多应用程序。

不要在同一页面上混合使用HTTP和HTTPS。 如果你有一个通过HTTP提供的表单页面,我会对提交数据感到紧张 – 我看不到提交是通过HTTPS还是HTTP,而没有执行查看源代码并寻找它。

通过HTTPS提交表单以及提交链接并不是对优势的重大改变。

使用这是不够的:

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

如果您有任何http内容(如外部http图像源),则浏览器将检测到可能的威胁。 因此,请确保您的代码中的所有ref和src都是https

对于那些使用IIS在web.config中添加这一行将有助于:

 <httpProtocol> <customHeaders> <add name="Strict-Transport-Security" value="max-age=31536000"/> </customHeaders> </httpProtocol> <rewrite> <rules> <rule name="HTTP to HTTPS redirect" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" /> </rule> </rules> </rewrite> 

一个完整的示例文件

 <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <httpProtocol> <customHeaders> <add name="Strict-Transport-Security" value="max-age=31536000"/> </customHeaders> </httpProtocol> <rewrite> <rules> <rule name="HTTP to HTTPS redirect" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" /> </rule> </rules> </rewrite> </system.webServer> </configuration> 

你不应该出于安全原因。 特别是如果在这里玩cookies。 它让你无法接受基于cookie的重播攻击。

无论哪种方式,你应该使用Apache控制规则来调整它。

然后,您可以在需要时testingHTTPS被启用并根据需要redirect。

您应该只使用FORM POST(无法获取)redirect到付费页面,并且在没有POST的情况下访问该页面应该返回到其他页面。 (这会赶上人们热跳。)

http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/

是一个很好的起点,为不提供更多的道歉。 但你真的应该通过SSL推动一切。

这是过度保护,但至less你有更less的担心。

如果您使用Apache或类似支持.htaccess文件的LiteSpeed,您可以执行以下操作。 如果你还没有.htaccess文件,你应该在你的根目录下创build一个新的.htaccess文件(通常是你的index.php所在的位置)。 现在将这些行作为第一个重写规则添加到.htaccess中:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

你只需要在你的.htaccess中的指令“RewriteEngine On”一次就可以完成所有的重写规则,所以如果你已经拥有它了,只需复制第二行和第三行即可。

我希望这有帮助。

我已经通过许多解决scheme检查$ _SERVER [HTTPS]的状态,但似乎是不可靠的,因为有时它不会设置或设置为打开,closures等导致脚本内部循环redirect。

如果您的服务器支持$ _SERVER [SCRIPT_URI],则这是最可靠的解决scheme

 if (stripos(substr($_SERVER[SCRIPT_URI], 0, 5), "https") === false) { header("location:https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"); echo "<meta http-equiv='refresh' content='0; url=https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]'>"; exit; } 

请注意,取决于您的安装,您的服务器可能不支持$ _SERVER [SCRIPT_URI],但如果这样做,这是更好的脚本使用。

你可以在这里检查: 为什么一些PHP安装有$ _SERVER ['SCRIPT_URI']而其他的不是

我已经使用这个脚本,它通过网站运作良好。

 if(empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off"){ $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; enter code hereheader('HTTP/1.1 301 Moved Permanently'); header('Location: ' . $redirect); exit(); } 
 <?php // Require https if ($_SERVER['HTTPS'] != "on") { $url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; header("Location: $url"); exit; } ?> 

那很简单。