我如何使用.htaccess和mod_rewrite页面特定于PHP强制到SSL/https。
当前回答
对于Apache,你可以使用mod_ssl强制SSL与SSLRequireSSL指令:
该指令禁止访问,除非当前连接启用了HTTP over SSL(即HTTPS)。这在启用ssl的虚拟主机或目录中非常方便,可以防止暴露应该保护的内容的配置错误。当这个指令出现时,所有不使用SSL的请求都将被拒绝。
这将不会重定向到https。要重定向,请在.htaccess文件中尝试以下mod_rewrite
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
或文中给出的任何一种方法
http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
你也可以从PHP内部解决这个问题,如果你的提供者已经禁用了.htaccess(这是不太可能的,因为你要求它,但无论如何)
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
if(!headers_sent()) {
header("Status: 301 Moved Permanently");
header(sprintf(
'Location: https://%s%s',
$_SERVER['HTTP_HOST'],
$_SERVER['REQUEST_URI']
));
exit();
}
}
其他回答
这个代码适用于我
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
我只是想指出,当跨目录深度使用多个.htaccess文件时,Apache的继承规则是最差的。两个主要陷阱:
默认情况下,只有包含在最深的.htaccess文件中的规则将被执行。你必须指定RewriteOptions InheritDownBefore指令(或类似指令)来改变这个。(见问题) 该模式应用于相对于子目录的文件路径,而不是包含给定规则的.htaccess文件的上层目录。(见讨论)
这意味着如果您在子目录中使用任何其他.htaccess文件,则Apache Wiki上建议的全局解决方案将不起作用。我写了一个修改后的版本:
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteOptions InheritDownBefore
# This prevents the rule from being overrided by .htaccess files in subdirectories.
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [QSA,R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e. http://www.example.com/foo/ to https://www.example.com/foo/
我发现了一个mod_rewrite解决方案,它既适用于代理服务器,也适用于未代理服务器。
如果您正在使用CloudFlare、AWS弹性负载平衡、Heroku、OpenShift或任何其他云/PaaS解决方案,并且您正在使用正常的HTTPS重定向循环,请尝试以下代码片段。
RewriteEngine On
# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on
# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
简单一点:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow
用example.com替换你的url
简单易行,只需添加以下内容
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
推荐文章
- 阻止人们入侵基于php的Flash游戏高分表的最佳方法是什么
- 如何允许本地主机上的Apache使用HTTPS ?
- PHP子字符串提取。获取第一个'/'之前的字符串或整个字符串
- __construct函数的作用是什么?
- PHP中的异步shell执行器
- Laravel 5 -如何访问在视图存储上传的图像?
- 为什么在PHP中使用sprintf函数?
- “质量分配”在Laravel中是什么意思?
- 在逗号上爆炸字符串,并修剪每个值的潜在空格
- 如何让Chrome允许混合内容?
- 无法识别的SSL消息,明文连接?异常
- PHP与MySQL 8.0+错误:服务器请求身份验证方法未知的客户端
- laravel5“LIKE”对等物(雄辩的)
- 在函数中使用默认实参
- 转换php数组到Javascript