重写规则添加.html扩展名

时间:2011-04-21 14:29:20

标签: .htaccess redirect

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

新客户最近更改了电子商务脚本,新版本以不同方式处理SEO,并更改了所有16,000多个产品链接。在重新编制索引之前没有捕获到这一点,因此我们需要将旧版本重定向到新版本。

所有产品都有这样的链接 domain.com/category/productname 但现在 domain.com/category/productname.html

类别链接没有改变,所有都是这样的 domain.com/category/(带斜杠)

10 个答案:

答案 0 :(得分:16)

来自@ david-wolever的答案将.html(或根目录)中未结尾的所有内容重定向到具有添加的.html扩展名的相同网址,这意味着它会在CSS和JavaScripts文件之类的地方附加.html扩展名,例如它会将/style.css重定向到/style.css.html,这可能不是你想要的。之后还有空格!可能导致@greggles 500s的角色

这会重定向不以点结尾的网址,后跟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)$

答案 1 :(得分:8)

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

Options FollowSymLinks

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

答案 2 :(得分: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(搜索“redirect | R”)。

答案 3 :(得分:3)

来自@ paul.grov.es的答案似乎对我很好,但后来我发现我的javascript不再有效了。

解决方案很明显,并且由他提到:在网址中添加了“.html”,因为javascript扩展名只有2个字符。

所以,我的解决方案原来是:

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

答案 4 :(得分:3)

这是旧帖子,但仍然值得发布这个问题的工作/测试答案:

RewriteEngine On

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

跳过RewriteCond %{REQUEST_FILENAME} !-f条件,因为正则表达式模式与任何带有点的URI都不匹配。

答案 5 :(得分:1)

以上解决方案对我不起作用,
我找到了一个有效的解决方案:
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]

答案 6 :(得分:0)

我的nginx解决方案:

强制.html扩展

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

答案 7 :(得分:0)

在重写X.html之前确保它确实存在:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ %{REQUEST_FILENAME}.html
  • 条件!-f文件不符合要求
  • 条件!-d目录不符合要求
  • 条件-f扩展名为'.html'的文件确实存在

答案 8 :(得分:0)

这里有很多类似工作的答案,但到目前为止,自 apache 2.4 以来最简单的方法就是启用 MultiViews,请参阅官方文档 https://httpd.apache.org/docs/2.4/content-negotiation.html

我所要做的就是:

<Directory /var/www/html>
  Options +MultiViews
</Directory>

这意味着如果我访问我的网站,例如example.com/dashboard 它只提供dashboard.html 而不需要任何重定向,它保持原来的URL(所以它不附加扩展名)。

我无法在文档中找到有关哪些文件扩展名具有优先级的详细信息,因此不确定如果您在目录中同时存在dashboard.html 和dashboard.php 会发生什么,或者是否可以轻松更改优先级顺序.

答案 9 :(得分:0)

我认为这是最好的方式

RewriteCond %{REQUEST_FILENAME} !-d 重写规则 ^([^.]+?)/?$ %{REQUEST_URI}.html [L,R=302]