我需要一个规则,只要“没有”斜杠就会添加.html扩展名。
新客户最近更改了电子商务脚本,新版本以不同方式处理SEO,并更改了所有16,000多个产品链接。在重新编制索引之前没有捕获到这一点,因此我们需要将旧版本重定向到新版本。
所有产品都有这样的链接 domain.com/category/productname 但现在 domain.com/category/productname.html
类别链接没有改变,所有都是这样的 domain.com/category/(带斜杠)
答案 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]