2015-10-12 191 views
1

我想刪除文件結尾(.html)和URL後面的斜線。當用戶輸入請求ttp://example.com/jobs/director.html時,他應該被重定向到http://example.com/jobs/director。這適用於大多數情況,但是當頁面名稱等於子目錄的名稱時,不會刪除結尾的斜槓,並且服務器嘗試按如下方式解析路徑:/jobs/.html(本例中的請求爲http://example.com/jobs/) 。有人知道解決方案嗎?我很困難。謝謝!用htaccess刪除尾部斜槓

我的文件結構:

  • 作業(目錄)

  • 工作/ artist.html

  • 工作/ director.html

  • 的index.html

  • jobs.html

我的.htaccess文件:

Options +FollowSymLinks 
RewriteEngine On 
DirectorySlash Off 

# remove trailing slash 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} (.+)/$ 
RewriteRule^%1 [R=301,L] 

# remove .html file ending 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^\.]+)$ $1.html [NC,L] 
+0

如果你想'jobs.html'是通過'/ jobs'訪問,那麼是怎樣的服務器應該知道HTML文件或文件夾是否被請求?這不是一個好的設置,即使你現在可以設法解決這個單一問題,它可能會導致未來的進一步問題。我強烈建議您將這兩個名稱中的任何一個更改爲不同的名稱。 – CBroe

+0

_「,但是當頁面名稱等於子目錄的名稱時,不會刪除結尾的斜槓」_ - 很確定它是_is_ - 但是接下來將缺少尾部斜槓的請求重定向到具有尾部的版本的默認機制斜槓踢,並撤消您的刪除... ['DirectorySlash'](http://httpd.apache.org/docs/2.2/en/mod/mod_dir.html#directoryslash)指令控制這種行爲,但在你混淆我建議你仔細閱讀它的文檔。 – CBroe

+0

我不能改變結構,因爲我需要有工作子頁面(工作/藝術家,工作/導演)。我可以將index.html中的jobs.html移動到目錄中,但是我已經閱讀DirectoryIndex僅在啓用DirectorySlash時請求。感謝文檔的鏈接,我對這個主題很陌生,但很好解釋,現在我明白了,當我關閉DirectorySlash時,我必須小心。 – geierwally

回答

0

您可以使用:

Options +FollowSymLinks 
RewriteEngine On 
DirectorySlash Off 

# remove trailing slash to non-directories 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+?)/$ /$1 [R=302,L] 

# add trailing slash internally to directories 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+?[^/])$ $1/ [L] 

# add .html file ending internally 
RewriteCond %{DOCUMENT_ROOT}/$1\.html -f 
RewriteRule ^(.+?)/?$ $1.html [L] 
+0

謝謝你的回答,這個作品!我想如果這個解決方案對性能不好(如果它可以用更少的重定向來解決),但我是這個主題的新手。在閱讀一些文檔後,我認爲最好的解決方案是使用DirectoryIndexes解決它(我可以將目錄作業中的jobs.html移動到index.html中),但我認爲這是不可能的,因爲我關閉了DirectorySlash。 – geierwally

+0

謝謝你是對的,我沒有理解外部重定向和內部重寫之間的區別! – geierwally

+0

對於一個真正的目錄,無論是第一個規則觸發還是第二個規則,因爲一個具有'!-d'條件,另一個具有'-d'條件,所以沒有性能問題。 – anubhava