2011-10-15 180 views
25

我在我的htaccess文件下面的代碼末尾:的.htaccess重寫部隊尾隨斜槓

# Force Trailing Slash 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301] 

這似乎很好地工作,當我去www.mydomain.com/test重定向它來/測試/。問題是,當我去www.mydomain.com/test/another它並沒有把尾部的斜槓上的另一個。

有誰知道如何修改我的代碼,使結尾的斜線工作不管URL是多久?

謝謝!

回答

27
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] 

編輯:在案件要排除一些請求像PHP文件:

RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|gif)$ 
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] 
+1

您可能還想包含css和js。這非常有用! – Eruant

+0

@undone請問html代表什麼'?',爲什麼你沒有把'php?'帶上問號? – DanFromGermany

+6

@DanFromGermany regexp中的問號表示前面的字符(在本例中爲** l **)可能存在或不存在於字符串中。所以可以涵蓋** htm **和** html **擴展名! – undone

0
RewriteRule ^(.*)[^/]$ $1/ [L,R=301] 

這應該工作得很好。它只是檢查以確保尾部字符不是斜槓並添加一個。

+0

你重寫上面以下條件排除他們所有的請求規則不起作用! – undone

+2

它吃最後一個字符!這裏是修復:'RewriteRule ^((。*)[^ /])$ $ 1/[L,R = 301]' – Ajax

62

稍微更強大的答案,基於the answer above

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)([^/])$  /$1$2/ [L,R=301] 

RewriteCond將檢查以確保沒有該名稱的文件,如果沒有,則執行RewriteRule。比擁有手動擴展名列表更具前瞻性!

+0

我試過這個,但是它添加了一個以.html結尾的文件尾部的斜線 – moobot

+0

如果URL導致一個真實的文件,它不應該觸及這個規則;你是否不必要地將'.html'加入你的「漂亮」網址? – jeffbyrnes

+1

不是我,但我猜Magento是!感謝您的回覆,但我確實發現了一個重定向,它只是將它添加到沒有擴展名的URL: http://www.paulund.co.uk/using-htaccess-to-force-trailing-slash – moobot

4

雖然Death's solution工作,當你忘記某些文件類型添加到列表中它可以是惱人。你可以這樣做來強制不直接指向的條件使用!-f文件的所有URL斜線。

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*[^/])$ http://%{HTTP_HOST}/$1/ [L,R=301] 
+0

我試過這個,但是它在以.html結尾的文件中添加了一個斜槓 – moobot

+0

我也試過這個,但仍然看到尾隨的斜槓添加到了像sitemap.xml這樣的頁面。服務器設置是否有可能決定將什麼視爲要下載的文件以及要在瀏覽器中呈現的文件,並且這會影響「!-f」的解釋方式? – Mattypants

1

接受的答案不適用於我。這樣做,從SEOMoz

# Ensure all URLs have a trailing slash. 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ http://www.example.com/$1/ [L,R=301] 

注意每個規則的RewriteBase /。至少,當我刪除它時,它停止工作。

+0

它岩石! tnks – PJunior

0

這是爲我工作完美。 (來自用戶阿賈克斯的評論)
與其他環節的問題是我的CSS停止應用重定向規則之後的工作,但CSS也工作正常與以下重寫規則

RewriteRule ^((.*)[^/])$ $1/ [L,R=301] 

完整代碼

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteBase/
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_URI} !(.*)/$ 
    #Force Trailing slash 
    RewriteRule ^((.*)[^/])$ $1/ [L,R=301] 
</IfModule> 
0

這一切正常,我和一些人所認爲的「-f」標誌不依賴於評估到實際文件:

RewriteCond %{REQUEST_URI} !\.[a-z0-9]+$ [NC] 
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] 
0

上面的例子並不適用於我,這要歸功於規則末尾的強制斜槓,例如$ 1 $ 2 /。

工作對我來說這(我用了WordPress和重定向到HTTPS)。你必須的條件和規則行添加僅次於RewriteEngine敘述和RewriteBase線:

# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/

# I added these two lines for redirect to HTTPS 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L] 

RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 
# END WordPress` 
-3
<rule name="Remove trailing slash" stopProcessing="true"> 
    <match url="^([^.]+)/$" /> 

在你的配置文件中添加這一規則,它是爲我工作

+0

+0

您應該將代碼行添加到答案中,而不是評論它! – Timothy

0

要強制結尾的斜線,你可以使用:

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R] 

注意運行mod-dir模塊之前mod-rewrite自動添加一個尾隨斜線時,看到了一個請求所以我們必須從規則中排除目錄,否則使用某些服務器上沒有RewriteCond %{REQUEST_FILENAME} !-d的規則,則最終會在/dir//或者如果關閉了目錄閃存,則會導致問題。

上面的規則增加了尾部斜槓包括擴展名的文件,如果你不想用斜線您的文件,您可以通過添加規則

RewriteCond %{REQUEST_FILENAME} !-f