2010-01-02 46 views
32

我有一個小數量的靜態網站,我只是想隱藏.html擴展名的:如何隱藏與Apache的mod_rewrite .html擴展

  • 的URL /foo獲取靜態文件/foo.html
  • 的瀏覽器仍然顯示的URL /foo

然後,客戶機可以在風格mydomain.com/foo送出書籤,而不是mydomain.com/foo.html

這聽起來很簡單,我以前使用mod_rewrite之前(使用WordPress或重定向),但這被證明是更難以破解,我認爲。也許我失去了一些東西真的很明顯,但我不能在任何地方找到一個解決方案,我一直在這一切的一天!

我們運行我們自己的服務器,所以這次能去的地方是最好的地方。

附錄

該解決方案如下檢查工作的罰款。然後,在運行該網站一段時間後,我注意到兩個問題:

  1. 所有頁面開始出現無格式。我重新加載,清除緩存等,但仍然沒有風格。我以前遇到過這個麻煩,無法找到源代碼。

  2. 有一個目錄,並命名爲「畫廊」的HTML文件,以便/畫廊鏈接顯示一個目錄列表,而不是HTML文件。我應該能夠排序的那一個,但進一步的提示歡迎:-)

回答

39

試試這個規則:

RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L] 

這將改寫,可以追加當被映射到一個現有的文件的所有請求.html

+1

謝謝!只是將模式更改爲'(。[a-z] +)',因爲所有的html文件都只包含那些字符。新的問題現在最糟糕的是沒有CSS(這最初出現在重新加載,然後打開和關閉樣式,現在所有的文件都是沒有樣式的,所以我想早期的視圖獲取緩存的CSS文件?)。 – 2010-01-03 17:48:31

+0

@DaveEveritt我有相同的CSS問題,只有當我追加一個尾部的斜槓到URL,在這種情況下,所有相關的鏈接被認爲是在一個子目錄,包括CSS。你找到了解決方法嗎? – Lazlo 2012-01-12 14:47:32

+1

@LazloBonin一種解決方案不是使用絕對路徑代替相對路徑。或者使用適當的路徑顯式設置一個基本URL,以便從基本URL路徑而不是當前URL路徑解析相對路徑。 – Gumbo 2012-01-12 15:25:45

1

下面是一個例子,它允許我們將文件存儲在磁盤上:

foo.html.php 

但在瀏覽器,稱其爲

foo.html 

爲了使這個爲你工作,我想你只需要稍作修改,以配合您現有的請求,併爲您在地方與.html擴展一個實際的文件。

# These are so we do not need the .php extension 
RewriteCond %{REQUEST_FILENAME} (\.xul|\.html|\.xhtml|\.xml)$', 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.php -f', 
RewriteRule ^(.*)$ $1.php', 
23

以前的答案不檢查請求的路徑是否是目錄。

這裏是一個不重寫,如果請求的路徑是一個目錄(如原題說明)的全部重寫條件:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d   # is not directory 
RewriteCond %{REQUEST_FILENAME}\.html -f  # is an existing html file 
RewriteRule ^(.*)$ $1.html     # rewrite index to index.html 

要SEO友好和避免雙重內容,重定向。HTML網址:

# Redirects domain.com/file.html to domain.com/file 
RewriteCond %{REQUEST_FILENAME} !-d   # is not directory 
RewriteCond %{REQUEST_FILENAME}\.html -f  # is an existing html file 
RewriteCond %{REQUEST_URI} ^(.+)\.html$  # request URI ends with .html 
RewriteRule (.*)\.html$ /$1 [R=301,L]  # redirect from index.html to index 

如果您需要相同的腳本,看看這裏: How can I use .htaccess to hide .php URL extensions?

+0

我是否需要包含這兩個規則或僅包含最後一個?第一個加載/ index並顯示index.html文件。但包括第二個塊不會將/index.html重定向到/ index索引以獲取重複內容。 – Luke 2013-07-18 14:33:54

+0

您需要兩個規則塊。第一個在內部重寫'index'到'index.html',所以用戶看不到它。第二個塊做301重定向從index.html到index。 – SailAvid 2013-07-18 18:51:22

+3

注意 - 至少像Apache 2.2.23的 - 在線評論,顯然是不支持的,所以上面的定義將打破'.htaccess'文件,並導致'500'錯誤,除非你刪除內聯註釋。 – mklement0 2013-08-21 02:08:35

9

接受的解決方案不工作當網站配置了虛擬主機/文檔根目錄。

還有就是我用的解決方案:

RewriteEngine on 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.html -f 
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L] 
+0

作品完美,感謝 – tvazac 2016-02-19 12:18:25

3

.*.html請求刪除.html擴展,可以使用下面的腳本在root/.htaccess

RewriteEngine On 
RewriteBase/
#1) externally redirect "/file.html" to "/file" 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.html [NC] 
RewriteRule^%1 [R=301,L] 
#2) rewrite "/file" back to "/file.html" 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^(.*?)/?$ $1.html [NC,L] 
+0

感謝,儘管這是一個老問題,我用[Nanoc(http://nanoc.ws/)(靜態站點生成器)對這樣的網站。我試過了,但分拆問題依然存在 - 我的風格完全消失。 – 2016-06-25 09:05:53

+0

不客氣@DaveEveritt! 要解決你的風格,JS,圖片和重寫的URL等相關資源,你可以添加一個基本標記到您的網頁'的頭部<基本href =「/」>'更多info..read我的答案對這個職位 http://stackoverflow.com/questions/31241701/seo-friendly-url-css-img-js-not-working/31241992#31241992 – starkeen 2016-06-25 09:19:28

+0

再次嘗試,但仍然沒有喜悅。這是一箇舊網站,我使用SSI(在您的示例中將.html更改爲.shtml),並已將所有主要分節移到其自己的目錄中,但這些目錄中的非索引.shtml頁面將其包含的目錄從其中刪除URL如此404以及「/styles/body.css」仍無法加載整個網站。無論如何,感謝提示,但現在我將放棄這個網站,因爲該網站將在某個時刻重新制作! – 2016-06-26 17:49:21

0

哇,我很少見到這樣的問題,網絡上存在如此多的「解決方案」,人們只是拋出「爲他們工作」的東西,但很少有時間閱讀文檔來弄清楚它的功能。例如,這裏給出的許多解決方案不適用於虛擬主機。

經過大量的交叉引用和閱讀之後,我想貢獻自己的「適合我」的解決方案。希望它也適用於你。我沒有從頭開始創建它;我受到了所有其他貢獻的啓發(儘管其中大部分貢獻都沒有「爲我工作」而沒有修改)。

RewriteEngine on 

#if foo requested, return foo.html contents 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.html -f 
RewriteRule ^(.*)$ $1.html [L] 

#redirect foo.html to foo 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d 
RewriteRule ^(.+)\.html$ $1 [R,L] 

[R]標誌在默認情況下執行臨時(302)重定向;如果您想要永久重定向,請使用R=301代替R

+0

試過這個,同樣的問題!沒關係,因爲我正在重寫網站,無論如何感謝:-) – 2016-06-28 22:36:52