我只有一个页面,我想强制作为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.我知道如果它实际上是一个有购物车等的页面,你会以不同的方式做到这一点.您可以将其视为一个网站,该网站以一个价格销售一件商品,您可以在其中输入您的信用卡信息,然后将其提交到外部网站上的支付网关,以便明确向您的卡收费一次.
我以前做过的方式基本上就像你写的那样,但没有任何硬编码的值:
if($_SERVER["HTTPS"] != "on") { header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]); exit(); }
您可以在Apache上使用指令和mod_rewrite来执行此操作:
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
如果需要,您可以使用正则表达式使位置更智能.
您应该强制客户端始终使用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头,以便在可能的情况下应由浏览器重定向其他客户端请求.
我刚刚创建了一个.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); }
在负载均衡器后面运行时,不得不做这样的事情.帽子提示/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; } }
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的文件夹中.
好的..现在这里有很多东西,但没有人真正完成"安全"问题.对我来说,使用不安全的东西是荒谬的.
除非你用它作诱饵.
$ _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)
来命名一对.
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]