尝试将这些规则放在文档根目录的 htaccess 文件中:
RewriteEngine
# 1. hiding the .html extensions
RewriteCond %{REQUEST_URI} ^/(.*?)/?$
RewriteCond %{DOCUMENT_ROOT}/%1.html -f
RewriteRule ^ /%1.html [L]
# 2. 301 redirecting .html version
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.html
RewriteCond %1 !foo$
RewriteRule ^ /%1 [L,R=301]
# 3. typing /foo.html to resolve to / as well as typing /foo to resolve to /
RewriteCond %{REQUEST_URI} ^/(.*?/?)foo(\.html)?$
RewriteRule ^ /%1 [L,R=301]
此外,请确保您已关闭多视图:
Options -Multiviews
第一条规则有 2 个条件,第一个将 URI 分组在 first/
和可能的 last之间/
。在下一个条件中使用%1/path/to/www/document/root/%1.html
引用它,看看它是否是一个存在的文件。如果两者都为真,它会在内部重写 URI 以.html
在末尾包含 a。
第二条规则有 2 个条件,第一个匹配实际请求而不是 URI(它可以随着规则的应用和重写发生而改变)。它查看是否存在以 结尾的请求,.html
如果是,则第二个条件确保它不是foo.html
请求(因为最后一个规则处理了该请求)。如果两者都为真,那么它将浏览器重定向到没有 html 的 URI 部分,再次使用%1从第一个条件引用匹配中的分组([^\ ]+)
。
最后一条规则检查请求是针对 afoo
还是foo.html
。如果是这样,重定向删除 URI 的那部分。