我如何使用.htaccess和mod_rewrite页面特定于PHP强制到SSL/https。


当前回答

这个代码适用于我

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

其他回答

这个代码适用于我

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

尝试这段代码,它将工作于所有版本的url像

website.com www.website.com http://website.com http://www.website.com 重写%{HTTPS} off ^www.website.com$ [NC] RewriteRule ^ (. *) https://www.website.com/ 1美元(L, R = 301)

PHP解决方案

直接借用Gordon非常全面的回答,我注意到你的问题提到了强制HTTPS/SSL连接时页面特定。

function forceHTTPS(){
  $httpsURL = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
  if( count( $_POST )>0 )
    die( 'Page should be accessed with HTTPS, but a POST Submission has been sent here. Adjust the form to point to '.$httpsURL );
  if( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS']!=='on' ){
    if( !headers_sent() ){
      header( "Status: 301 Moved Permanently" );
      header( "Location: $httpsURL" );
      exit();
    }else{
      die( '<script type="javascript">document.location.href="'.$httpsURL.'";</script>' );
    }
  }
}

然后,在您希望通过PHP强制连接的这些页面的顶部,您可以要求()一个包含此(和任何其他)自定义函数的集中文件,然后简单地运行forceHTTPS()函数。

HTACCESS / mod_rewrite解决方案

我个人没有实现过这种解决方案(我倾向于使用PHP解决方案,就像上面的解决方案一样,因为它很简单),但是下面的方法可能至少是一个好的开始。

RewriteEngine on

# Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$

# Forcing HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{SERVER_PORT} 80
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_secure [OR]
RewriteCond %{REQUEST_URI} ^something_else_secure
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

# Forcing HTTP
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{SERVER_PORT} 443
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_public [OR]
RewriteCond %{REQUEST_URI} ^something_else_public
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

基于mod重写的解决方案:

在htaccess中使用以下代码自动将所有http请求转发到https。

RewriteEngine on

RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

这将重定向你的非www和www http请求到https的www版本。

其他解决方案(Apache 2.4*)

RewriteEngine on

RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

这在低版本的apache上不起作用,因为%{REQUEST_SCHEME}变量从2.4开始被添加到mod-rewrite中。

对于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();
    }
}