虛擬主機的 DocumentRoot 重寫上的通配符

虛擬主機的 DocumentRoot 重寫上的通配符

我在 apache2 中使用此配置作為通配符子域並且運行良好:

 <VirtualHost _default_:80>
   UseCanonicalName off
   Options FollowSymLinks
   VirtualDocumentRoot /var/www/domains/%0/httpdocs

    RewriteEngine On

    RewriteCond   %{HTTP_HOST}      ^\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
    RewriteRule   ^(.+)             /var/www/domains/localhost/httpdocs/$1 [L]

    RewriteCond   %{HTTP_HOST}      !^[^.]+\.abc\.net [NC]
    RewriteCond   %{HTTP_HOST}      !^[^.]+\.example\.me [NC]
    RewriteCond   %{HTTP_HOST}      !^[^.]+\.mysite\.info [NC]
    RewriteCond   %{HTTP_HOST}      !^[^.]+\.xyz\.org [NC]
    RewriteCond   %{HTTP_HOST}      !\.internal$ [NC]
    RewriteCond   %{REQUEST_URI}    !^/collateral/ [NC]

    RewriteRule   ^(.+)             /var/www/domains/%{HTTP_HOST}/httpdocs/%{HTTP_HOST}/$1
    ErrorDocument 403 /error/404.php

這意味著請求“http://sub.abc.net“將取得文檔根目錄“/var/www/domains/sub.abc.net/httpdocs”並請求“http://sub.xyz.org“將取得文檔根目錄“/var/www/domains/sub.xyz.org/httpdocs”。

但我希望對 *.abc.net 的請求將被重寫為 *.xyz.org documentroot。

答案1

我們需要任何.org網域應該重定向到.net網域 documentroot

我認為你的意思是“重寫”,而不是外部“重定向”,就像你問題中的程式碼一樣? (正如您的問題中所述,您還反轉了所需重寫的方向,但無論如何,我會按照您在評論中所述的內容.......org到`.net)

這假設您只有單級 TLD,如程式碼中引用的那樣(例如.net.me.info.org等),而不是多級“TLD”,例如.co.uk.

RewriteCond   %{HTTP_HOST}      !^[^.]+\.abc\.net [NC]
RewriteCond   %{HTTP_HOST}      !^[^.]+\.example\.me [NC]
RewriteCond   %{HTTP_HOST}      !^[^.]+\.mysite\.info [NC]
RewriteCond   %{HTTP_HOST}      !^[^.]+\.xyz\.org [NC]
RewriteCond   %{HTTP_HOST}      !\.internal$ [NC]
RewriteCond   %{REQUEST_URI}    !^/collateral/ [NC]
RewriteRule   ^(.+)             /var/www/domains/%{HTTP_HOST}/httpdocs/%{HTTP_HOST}/$1

請嘗試類似以下內容:

# If any of these domains are requested then stop
RewriteCond %{HTTP_HOST}      ^[^.]+\.abc\.net [NC,OR]
RewriteCond %{HTTP_HOST}      ^[^.]+\.example\.me [NC,OR]
RewriteCond %{HTTP_HOST}      ^[^.]+\.mysite\.info [NC,OR]
RewriteCond %{HTTP_HOST}      ^[^.]+\.xyz\.org [NC,OR]
RewriteCond %{HTTP_HOST}      \.internal$ [NC,OR]
RewriteCond %{REQUEST_URI}    ^/collateral/ [NC]
RewriteRule ^ - [L]

# Split the requested host into HOSTNAME + TLD (env vars)
RewriteCond %{HTTP_HOST} ^([^.]+\.[^.]+)\.([^.]+)
RewriteRule ^ - [E=HOSTNAME:%1,E=TLD:%2]

# Change TLD "org" to "net"
RewriteCond %{ENV:TLD} =org [NC]
RewriteRule ^ - [E=TLD:net]

RewriteRule (.+) /var/www/domains/%{ENV:HOSTNAME}.%{ENV:TLD}/httpdocs/%{ENV:HOSTNAME}.%{ENV:TLD}/$1 [L]

第一個指令塊扭轉了你目前的狀況。 IE。它說如果請求是針對“這些域”中的任何一個,則停止處理,而不是...僅在請求時重寫不是匹配任何“這些域”。這使得以下規則變得更簡單,因為我們現在知道所要求的主機是我們想要重寫的主機,因此我們不需要在程式碼中新增更多條件。

然後我們將請求HTTP_HOST分成主機名稱(子域+域)和頂級域名僅有的。並將它們分別儲存在兩個環境變數中:HOSTNAMETLD

然後我們測試TLD環境變數並在必要時更改它(即org更改為net)。

最後,無條件重寫適當的文檔根目錄和子目錄(使用上面分配的環境變數),如程式碼所示。請注意,您在描述中僅提到了“文檔根目錄”,但您的程式碼還包含一個同名的子目錄,因此我也包含了該子目錄。

這假設您的問題中所述的 mod_rewrite 指令是完整的。 IE。配置中沒有其他依賴指令嗎?L為了更好地衡量,我添加了標誌。

相關內容