2013-03-01 146 views
3

這是我到目前爲止有:.htaccess force「www。」在一切,但子域和刪除尾隨斜線

#Force www. 
RewriteCond %{HTTPS} !=on 
RewriteCond %{HTTP_HOST} !^www\..+$ [NC] 
RewriteRule^http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

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

然而,這打亂了所有子域執行以下操作重定向:

sub.domain.com -> www.sub.domain.com 

而且也,其依賴於寫在刪除結尾斜槓位上的域。

所以......兩個問題。

如何在「刪除尾部斜線」位上重寫規則以排除在其上寫入域?

如何使rewritecond在「force www」排除子域,而不顯式寫下子域。位?預期的效果

例子 -

sub.domain.com/something/ -> sub.domain.com/something 
domain.com/something/ -> www.domain.com/something 
www.domain.com/ -> www.domain.com 
sub.domain.com -> sub.domain.com 

謝謝!

+0

目前還不清楚你想要發生什麼。你能提供一組輸入和你想要它們轉換成什麼? – RoUS 2013-03-01 22:06:57

+0

我加了一些例子! – 2013-03-01 22:30:40

回答

7

更改WWW檢查實際的域:

#Force www. 
RewriteCond %{HTTPS} !=on 
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC] 
RewriteRule^http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

或者,如果您是舉辦一堆域,您可以在TLD之前檢查名稱:

RewriteCond %{HTTPS} !=on 
RewriteCond %{HTTP_HOST} ^([^.]+)\.([a-z]{2,4})$ [NC] 
RewriteRule^http://www.%1.%2%{REQUEST_URI} [L,R=301] 

至於斜線,你必須小心不要求目錄的請求。因爲如果是這樣,並且您打開了DirectorySlash(默認情況下它是打開的),那麼您將導致重定向循環。爲了排除子域名,我們假設第一條規則重定向瀏覽器以確保它以「www」開頭,並且子域名沒有被重定向到以「www」開頭,我們可以檢查:

#Remove trailing slash 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{HTTP_HOST} ^www\. [NC] 
RewriteRule ^(.+)/$ /$1 [R=301,L] 
+0

我用'force www'的第二個選項。無論是那一個還是'刪除尾部斜槓'都能很好地工作。 你介意解釋一下正則表達式和'force www'中的邏輯嗎? – 2013-03-04 03:25:37

+3

@OhCaN我們希望在'%{HTTP_HOST}'變量中有一個'.',所以'^'是字符串的開頭,那麼'([^。] +)'是一個或多個不是一個'.',然後一個'.',然後'([az] {2,4})匹配2到4個字母(az),字符串結尾是$''。 – 2013-03-04 03:49:03