2017-10-20 142 views
0

我有一個帶有html文件的靜態網站,我想在沒有.html結尾和尾部斜槓的情況下調用它們。.htaccess刪除.html擴展名並添加尾部斜槓並禁止.html文件

例如:

www.test.com/test.html 

應該可以下

www.test.com/test/ 

我管理這個具有以下的.htaccess

Options -Multiviews 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^([^\.]+)/$ $1.html 

不過的URL引線的兩個版本相同頁。我如何重定向(沒有.html)或爲.html版本扔404?

www.test.com/test.html 

這是帶有斜線的工作解決方案。謝謝@arkascha!

Options -Multiviews 
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^/?(.+)\.html$ /$1/ [R=301] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^([^\.]+)/$ $1.html [END] 

回答

0

好,添加另一個規則,明確以「文件擴展名」將請求重定向到URL ...

Options -Multiviews 
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^/?(.+)\.html$ /$1/ [R=301] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^/?([^\.]+)/?$ /$1.html [END] 

如果以上規則集導致HTTP狀態500(「服務器內部錯誤「),那麼你有可能會運行一個非常舊的apache http服務器版本。在這種情況下,你必須使用L標誌,而不是END標誌並添加附加條件到第一塊:

RewriteEngine On 

RewriteCond %{REQUEST_URI} .html$ 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^/?(.+)\.html$ /$1/ [R=301] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^/?([^\.]+)/?$ /$1.html [L] 

而且一般提示:你應該總是喜歡將裏面的這些規則http服務器(虛擬)主機配置,而不是使用動態配置文件(.htaccess樣式文件)。這些文件出了名的錯誤,很難調試,他們真的放慢了服務器。只有當你無法控制主機配置(讀取:真正便宜的主機服務提供商)或者如果你有一個依賴編寫自己的重寫規則的應用程序(這是一個明顯的安全噩夢) )。

+0

我已經試過了。這不起作用,因爲它以無限循環結束。 (第五行尾部的斜線缺失:RewriteRule^/?(。+)\。html $/$ 1/[R = 301]) –

+0

我沒有看到上面的規則集應該如何在無盡的重寫循環中結束..當然你沒有嘗試過類似的東西?關於該尾隨斜線:添加這樣的斜槓是很少見的,這就是爲什麼我將它遺漏出去的原因...... – arkascha

+0

我複製了您的代碼1:1,並且谷歌瀏覽器以ERR_TOO_MANY_REDIRECTS結尾。我用不同的瀏覽器和電腦試過了。嘗試一下,你會遇到同樣的問題。 –

相關問題