重新编写规则以添加.html扩展名

我需要一个规则,只要没有结尾的斜杠,就会添加一个.html扩展名。

一个新的客户最近改变了电子商务脚本,新版本不同地处理SEO,并改变了他们所有的16000+产品链接。 这是没有被捕获的网站被重新索引之前,所以我们需要redirect旧的新..

所有产品都有类似这个domain.com/category/productname的链接,但现在是domain.com/category/productname.html

分类链接没有改变,都是这样的domain.com/category/(尾随斜线)

来自@ david-wolever的答案将所有不以.html(或根)结尾的内容redirect到具有添加的.html扩展名的相同的URL,这意味着它会将一个.html扩展名附加到CSS和JavaScript文件之类的东西上,例如redirect /style.css到/style.css.html这不可能是你想要的。 它后面也有空格! 字符可能会导致@greggles 500s

这会redirect不会以点号结尾的url,后跟3个或4个字母数字字符:

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)$ 

这个选项类似于@ remco的,但是不需要使用[R](一个“外部”redirect被发送回浏览器)。 我还在第一个条件中添加了一个缺失\

 Options FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_URI} !^.*\.html$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ %{REQUEST_FILENAME}.html 
 RewriteEngine On
 RewriteCond%{REQUEST_URI}!  \ html的$
 RewriteCond%{REQUEST_URI}!  / $
 RewriteRule ^(。*)$ $ 1.html

你可能想在里面扔一个[R],或者其他东西。 请参阅文档: http : //httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule (search“redirect| R”)。

这是旧的线程,但仍然值得发布一个工作/testing的答案这个问题:

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

跳过RewriteCond %{REQUEST_FILENAME} !-f条件,因为正则expression式模式不符合任何URI与点。

@ paul.grov.es的答案似乎对我来说工作得很好,但后来我注意到我的JavaScript不工作了。

解决scheme是显而易见的,并提到他:一个“.html”被添加到该url,因为JavaScript扩展名只有2个字符。

所以,我的解决scheme竟然是:

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

上述解决scheme并不适合我,
我find了一个工作解决scheme:
http://www.garron.me/bits/add-html-extension-nginx-apache-htaccess.html
.htaccess部分。

RewriteCond%{REQUEST_URI}!^。 .html $ RewriteCond%{REQUEST_FILENAME}!-f RewriteCond%{REQUEST_FILENAME}!-d RewriteRule ^(。 )$ $ 1.html [L,R = 301]

我对nginx的解决scheme:

迫使.html扩展名

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