使用.htaccess强制子域的SSL HTTPS

时间:2016-05-27 10:56:27

标签: php apache .htaccess mod-rewrite ssl

我有一般用于在网站上强制使用SSL的代码:

if ($stmt = $mysqli->prepare("INSERT INTO users (`username`, `address`, `lat`, `lng`) VALUES (?,?,?,?)")) {
    $stmt->bind_param('ssii', $username, $address, $lat, $lng);
    // Execute the prepared query.
    if (! $stmt->execute()) {
        die('execute() failed: ' . htmlspecialchars($stmt->error));
    }
}
else {
    die('prepare() failed: ' . htmlspecialchars($database->error));
}
$stmt->close();

我从here获得了

我希望仅适用于特定的子域

例如,如果您要访问RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ,则应重定向到http://sub.domain.org

我有预感,我需要添加另一个https://sub.domain.org,其中基本上说是被点击的域名是http://sub.domain.org ,但我对此如何感到茫然写这段代码。

我一直在关注其他stackoverflow问题,例如:

Force HTTPS and WWW for domain and only HTTPS for subdomains HTACESS

Force SSL/https using .htaccess and mod_rewrite

和Apache文档:https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond

我有过这些尝试:

RewriteCond

在此question/answer中排除了答案:

RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} !^(reports\.)?uksacb\.org$ [NC]
RewriteRule ^.*$ https://%1%{REQUEST_URI} [R,L]

但是我仍然没有理解如何正确地做到这一点。

如果有人能向我解释我做错了什么,我需要做些什么才能做到正确,如何调试他们的重写条件和规则以确保其正常工作我将非常感激。有时我认为我的浏览器正在缓存我写的规则,我的不同尝试没有任何影响!

我的整个RewriteCond %{HTTPS} !=on RewriteCond %{HTTP_HOST} =reports.uksacb.org RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 看起来像这样:

             选项-MultiViews     

.htaccess

2 个答案:

答案 0 :(得分:11)

为避免使用我曾经使用的域名或子域名,请使用以下代码:

  # Redirect HTTP to HTTPS
  RewriteCond %{HTTPS} off
  RewriteCond %{HTTP:X-Forwarded-Proto} !https
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

我更喜欢没有WWW。

%{HTTPS} 如果请求是通过SSL提供的,则设置为on。

%{HTTP_HOST} 协议(http://或https://)与请求(/example-file.txt)之间的所有内容。

%{REQUEST_URI} 服务器地址之后的所有内容 - 例如,对http://example.com/my/example-file.txt的请求将此值设置为我的/ example-file.txt。

%{HTTP:X-Forwarded-Proto} 请求网址时使用的协议 - 设置为http或https。

我希望它对任何人都有用。

答案 1 :(得分:1)

为了进行调试,我使用了一个我找到http://martinmelin.se/rewrite-rule-tester/

的网站

使用您提供的规则

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

我在

收到错误
RewriteCond %{HTTPS} !=on

这可能适合你

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/%$1 [R,L] 

https://www.sslshopper.com/apache-redirect-http-to-https.html

找到上述示例