htaccess 文件對不同域執行特定規則
我有一個應用程序,它是多個域的伺服器(每個域都自定義應用程序的外觀。
此外,還有一個公共域,它有多個子域來顯示與上面相同的數據。
所以 -
www.apples.com
看起來與apples.efruit.co.uk
和 -
www.bananas.co.uk
看起來與bananas.efruit.co.uk
ETC
現在,我有一個 efruit.co.uk 域的萬用字元 ssl,所以我想使用 htaccess 文件強制所有 efruit.co.uk 請求使用 https(如果尚未這樣做)。
所有其他域都沒有 ssl,因此它們需要使用 http 來避免瀏覽器警告 - 再次來自 htaccess 文件。
我還想使用 htaccess 文件,這樣如果有人鍵入 www.apples.efruit.co.uk,它就會重寫為 apples.efruit.co.uk(如上所述通過 https)。然而,全球資訊網。如果它不是 efruit.co.uk 域,那很好。
最後,我有了標準且有據可查的 codeigniter 重寫規則,以使 url 更漂亮。
這是我到目前為止所擁有的。
Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_URI} !(health_check\.php)$ RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =https RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L] RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$ RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L] # block hidden directories RewriteRule "(^|/)\." - [F] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
唯一似乎可行的一點是強制 efruit.co.uk 域通過 https 提供服務。
您似乎在 SSL 代理(?)後面,因此使用
X-Forwarded-Proto
請求標頭,而不是HTTPS
伺服器變數。RewriteCond %{REQUEST_URI} !(health_check\.php)$ RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
雖然您聲明此位“有效”(“強制
efruit.co.uk
域通過 https 提供服務”),但這不會重定向主要的裸域,並且它還將維護 www 子域(如果存在於請求中) - 您應該首先將其剝離到避免二次重定向。因此,需要更改這些指令的順序。您也不需要擷取組(即帶括號的子模式),除非您打算將其用作反向引用 - 您似乎沒有。
所有其他域都沒有 ssl,因此它們需要使用 http 來避免瀏覽器警告 - 再次來自 htaccess 文件。
您不能發出 HTTPS 到 HTTP 重定向,
.htaccess
以避免在這些其他域上出現瀏覽器警告 - 這似乎是您的建議。因為在執行之前發生了無效的 SSL 證書瀏覽器警告。SSL 握手發生在請求的最開始。.htaccess
RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =https RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
因此,上述內容實際上不會從瀏覽器執行,除非使用者接受 SSL 證書警告(他們不應該接受)。
RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$ RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]
對於除
.htaccess
文件根目錄以外的任何內容,這將導致無效的重定向,因為$1
反向引用沒有斜杠前綴。即使對於文件根目錄,您也應該在替換時包含一個尾隨斜杠(儘管瀏覽器會隱式修復此問題)。另外,很好奇為什麼你REQUEST_URI
在前兩個規則中使用了 server 變數,但在這裡使用了反向引用?請嘗試以下方法:
# Prevent any fruther processing when requesting "health_check.php" # CHECK: Absence of start of string anchor? RewriteRule health_check\.php$ - [L] # Remove www sub-subdomain (and redirect to HTTPS) RewriteCond %{HTTP_HOST} ^www\.([^.]+)\.efruit\.co\.uk [NC] RewriteRule .* https://%1.efruit.co.uk%{REQUEST_URI} [R,L] # HTTP to HTTPS redirect for the "efruit.co.uk" domain (and subdomains) RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteCond %{HTTP_HOST} ^([^.]+\.)?efruit\.co\.uk [NC] RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L] # HTTPS to HTTP redirect for none "efruit.co.uk" domains # Note that the user will still have to click through any browser security warnings RewriteCond %{HTTP_HOST} !(^|\.)efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =https RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
其他注意事項:
- 在字元類中使用時無需反斜杠轉義文字點。
- 我
$
在主機檢查中刪除了字元串錨的結尾,以便擷取包含尾隨點的 FQDN。- 一旦您確認它們工作正常,您可能想要更改這些永久 (301) 重定向。IE。更改
R
為R=301
.