Apache-2.2

子域前面沒有 www 就無法工作

  • January 18, 2010

我之前在 cpanel 中有一個子域設置(sub.domain.com 重定向到 domain.com/sub/),今天突然我注意到它正在將瀏覽器中的 URL 重寫為 www.domain.com/sub/ 而不僅僅是只是將其保留為 sub.domain.com。我不確定問題出在哪裡,但決定刪除我的子域並在 cpanel 中重新創建它。現在我只能通過訪問 www.sub.domain.com 來訪問它(sub.domain.com 產生伺服器未找到錯誤)。

編輯:問題似乎在於 .htaccess 文件。刪除後,一切恢復正常。但是現在我的新問題是如何正確配置 .htaccess 文件。我最初對其進行了調整以嘗試完成以下操作:

我有三個文件夾,live、staging 和 dev:

1)對 domain.com 或 www.domain.com 的請求被定向到 domain.com/live(並且使用者看到的 url 總是被重寫為 www.domain.com)。

  1. 對 staging.domain.com 和 dev.domain.com 的請求或分別定向到 domain.com/staging 和 domain.com/dev,使用者在瀏覽器中看到 staging.domain.com 或 dev.domain.com .

3)當我在cpanel中添加它時,瀏覽器一般不會重寫任何子域。

我目前的 .htaccess 文件很好地完成了第 1 項,但將 staging.domain.com 重寫為 www.domain.com/staging 等等。

RewriteCond %{HTTP_HOST} !^www\.domain\.com$
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
RewriteRule ^$ /index.html

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.domain.com/$1/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/live/
RewriteRule ^(.*)$ /live/$1

我調整了原始程式碼的邏輯,似乎有一個可行的工作解決方案。我所做的每一個測試都是成功的,如果有人發現程式碼中的任何缺陷,或者如何優化它以適應原始問題中提出的條件,請插話。我在重寫方面幾乎沒有經驗。謝謝。

工作程式碼:

# REDIRECTS
#
# Add www in front of all URLs except subdomains
#
RewriteCond %{HTTP_HOST} ^domain\.com$
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
RewriteRule ^$ /index.html
#
# Add forward slash at end of www URLs
#
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.domain\.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.domain.com/$1/ [R=301,L]
#
# Forward requests to live folder
#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/live/
RewriteRule ^(.*)$ /live/$1

*注意:我不確定為什麼程式碼的最後一部分不會將子域 URL 重定向到活動文件夾。它按照我想要的方式工作,只是不知道為什麼^_^;

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