我在 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
分成主機名稱(子域+域)和頂級域名僅有的。並將它們分別儲存在兩個環境變數中:HOSTNAME
和TLD
。
然後我們測試TLD
環境變數並在必要時更改它(即org
更改為net
)。
最後,無條件重寫適當的文檔根目錄和子目錄(使用上面分配的環境變數),如程式碼所示。請注意,您在描述中僅提到了“文檔根目錄”,但您的程式碼還包含一個同名的子目錄,因此我也包含了該子目錄。
這假設您的問題中所述的 mod_rewrite 指令是完整的。 IE。配置中沒有其他依賴指令嗎?L
為了更好地衡量,我添加了標誌。