Dot-Htaccess

htaccess 文件對不同域執行特定規則

  • March 4, 2018

我有一個應用程序,它是多個域的伺服器(每個域都自定義應用程序的外觀。

此外,還有一個公共域,它有多個子域來顯示與上面相同的數據。

所以 -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。更改RR=301.

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