Ssl

轉發到 https 保持 URL 完整/完整

  • March 6, 2016

我想將所有流量轉發到 https。URL 中可能存在應保持不變的子域和子路徑。例子:

http://subdomain.myDomain.me -> https://subdomain.myDomain.me
http://myDomain.me/subpath -> https://myDomain.me/subpath
http://subdomain.myDomain.me/subpath -> https://subdomain.myDomain.me/subpath

我使用以下程式碼嘗試了這個簡潔的評估器(來自此處的連結)中的範例:

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https:/$1

在評估器中,一切都很好。 真正的虛擬主機是這樣的:

<virtualHost *:80>
   ServerName myDomain.me
   RewriteEngine On
   RewriteCond %{HTTPS} off
   RewriteRule ^(.*)$ https:/$1
</VirtualHost>

嘗試訪問真實站點時,會發生這種情況:

http://subdomain.myDomain.me -> http://subdomain.myDomain.me # fail - no https
http://myDomain.me/subpath -> https://myDomain.mesubpath # fail - subpath appended to top-level domain
http://subdomain.myDomain.me/subpath -> https://subdomain.myDomain.me/subpath # success

這個重寫有什麼問題?

正確的規則如下。

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

然而,這不是將 HTTP 請求重定向到 HTTPS 的推薦方法。首選方法是在 Apache confit 中使用重定向來指向啟用 SSL 的站點。

您可以在Apache Httpd wiki上詳細了解首選方法。

RewriteEngine On
#RewriteCond %{HTTPS} off # you can skip this if you want to redirect everything
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NC]

如果這不起作用,請嘗試:

RewriteRule ^(/(.*))?$ https://%{HTTP_HOST}/$1 [R=301,L,NC]

不要忘記發送R=301標誌以使重定向永久化。

引用自:https://serverfault.com/questions/761859