Apache Rewrite:如何寫基於網域名稱(而不是HTTP_HOST)的規則?

Apache Rewrite:如何寫基於網域名稱(而不是HTTP_HOST)的規則?

我編寫了一個基於 HTTP_HOST (www.domainname.com) 工作的 RewriteRule,但我希望它僅基於網域部分 (domainname.com) 工作。

進一步澄清

資料夾結構為/var/www/domainName.com.

當我在 apache conf 檔案中寫入此規則時

RewriteRule ^/js/(.*) /%{HTTP_HOST}/js/$1 [L]

並使用 www.mydomain.com 訪問該網站 - 它嘗試尋找/var/www/www.domainName.com不存在的資料夾。

因此,我需要轉換上述規則以從 HTTP_HOST 中刪除“www”。

答案1

我建議您重定向請求,而不是在兩個地方提供相同網站。建立一個新的 VirtualHost 來重定向流量:

<VirtualHost *:80>
    ServerName www.domainName.com
    Redirect / http://domainName.com/
</VirtualHost>

或在其他規則之上添加一組規則來檢測 www 的存在。前綴並重定向用戶:

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule /(.*) http://%1/$1 [R,L]

如果您確實希望您的網站位於兩個域名上而不進行任何重定向,則可以使用 RewriteCond 僅提取域名,並且它將作為 %1 供 RewriteRule 使用。

RewriteCond %{HTTP_HOST} ^(?:www\.)?(.*) [NC]
RewriteRule ^/js/(.*) /%1/js/$1 [L]

答案2

我懷疑您是否可以做到這一點,創建指向適當目錄的連結不是更容易嗎?

ln -s yourdomain.com www.yourdomain.com

答案3

你嘗試過使用嗎%{DOCUMENT_ROOT}

也可以,如果您在虛擬主機中設定了Servername與目錄結構中使用的名稱相同的名稱,例如:

<VirtualHost *:80>
  DocumentRoot /var/www/domainame.com
  ServerName domainame.com
  ServerAlias www.domainame.com
</VirtualHost>

然後你可以%{SERVER_NAME}在你的重寫規則中使用。

答案4

據我了解你的問題,只需設定你的文檔根目錄到正確的目錄:

DocumentRoot /var/www/domainName.com

相關內容