2011-04-21 62 views
10

我需要一個規則,只要沒有結尾的斜槓就會添加.html擴展名。ReWrite規則添加.html擴展

一位新客戶最近更改了電子商務腳本,新版本處理SEO的方式不同,並更改了所有16,000+個產品鏈接。這是沒有抓到被重新索引之前到現場,所以我們需要把舊重定向到新..

曾經有過這樣的 domain.com/category/productname 鏈接所有的產品,但現在 域.COM /分類/ productname.html

分類鏈接並沒有改變,所有的都是這樣 domain.com/category/(帶斜線)

回答

4
 
RewriteEngine On 
RewriteCond %{REQUEST_URI} ! \.html$ 
RewriteCond %{REQUEST_URI} ! /$ 
RewriteRule ^(.*)$ $1.html 

您可能要拋出一個[R]在那裏,或者一些東西。請參閱文檔:http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule(搜索「重定向| R」)。

+0

因此,我已經試過這(包括添加[R = 301,L]上的端部)和我得到一個500任何請求錯誤。我在服務器上嘗試了一個簡單的RewriteRule,並且它工作正常,所以我認爲在這個服務器上有一個缺陷,而不是在該服務器上的.htaccess/mod_rewrite的常規配置中。 – greggles 2012-08-29 17:45:12

14

來自@ david-wolever的回答將所有不以.html(或根目錄)結尾的內容重定向到具有添加的.html擴展名的相同網址,這意味着它會爲CSS和JavaScript文件等附加.html擴展名,例如它會將/style.css重定向到/style.css.html,這不太可能是你想要的。它後面也有空格!字符,這將有可能導致@greggles 500S

這重定向不以點之後3個或4個字母數字字符結尾的URL:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !\.[a-zA-Z0-9]{3,4} 
RewriteCond %{REQUEST_URI} !/$ 
RewriteRule ^(.*)$ $1.html 

或爲更細粒度的控制,白名單,你不希望擴展.html附加到例如

RewriteCond %{REQUEST_URI} !\.(html|css|js|less|jpg|png|gif)$ 
+0

我只能爲一個網址轉義嗎?因爲如果我在wordpress網站上使用這個,我將無法進入管理頁面。因爲當我輸入「domain/wp-admin」時,它會將我重定向到domain/wp-admin.html並返回404.同樣的事情發生在這個線程上的所有答案中。 – 2016-05-03 10:34:29

+0

不幸的是,這不適用於散列片段的URL,這是限制 – 2017-01-18 09:50:06

6

選項類似於@ remco's,但不需要使用[R](發送回瀏覽器的「外部」重定向)。我在第一個條件還增加了丟失\:

Options FollowSymLinks 

RewriteEngine On 
RewriteCond %{REQUEST_URI} !^.*\.html$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ %{REQUEST_FILENAME}.html 
2

從@ paul.grov.es答案似乎爲我工作得很好,但後來我發現我的JavaScript是不工作了。

解決方案很明顯,並提到他:一個'.html'被添加到URL,因爲JavaScript擴展名只有2個字符。

所以,我的解決方案竟然是:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !\.[a-zA-Z0-9]{2,4} 
RewriteCond %{REQUEST_URI} !/$ 
RewriteRule ^(.*)$ $1.html 
+0

的適用性。這實際上是正確的答案,因爲所有其他答案都不驗證以不同擴展名.html結尾的URL的存在性,我們會檢查它並驗證它是否是一個目錄。你只需要從'''RewriteCond%{REQUEST_URI}!/ $'''更改爲'''''''''RewriteCond%{REQUEST_FILENAME}!-d'''。 – 2016-04-25 15:55:51

3

這是舊的線程,但它仍然是值得張貼了這個問題的工作/測試答案:

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^.]+?)/?$ /$1.html [L,R=302] 

跳過RewriteCond %{REQUEST_FILENAME} !-f條件,因爲正則表達式模式不匹配任何帶點的URI。

+0

我的網站目前允許example.com/test和example.com/test.html工作。我想轉發所有非HTML強制.html。我可以使用你的上面,並改變302至301? – user1040259 2016-08-23 04:19:55

+0

是的,我相信它應該工作。 – anubhava 2016-08-23 06:40:52

+0

謝謝!你過去幫助過,我需要改變設置。謝謝。 http://stackoverflow.com/questions/39092679/htaccess-301-redirect-to-html – user1040259 2016-08-23 06:42:47

0

我給nginx的溶液:

迫使.html擴展

if ($request_filename !~ ^.+(.html|\/)$) { 
    return 301 $scheme://$host$request_uri.html; 
}