使用 .htaccess 删除 URL 中的 .html 文件扩展名

如果你是 Apache 服务器,想把 .html 扩展名从 URL 中去掉,也许会搜到如下的 .htaccess 配置:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /$1 [L,R=301] 

虽然这个代码可以实现访问 example.com/foo 等同于访问 example.com/foo.html

但是如果你访问 example.com/foo/ 或者 example.com/foo/bar 就会导致服务器 500 Internal Server Error,而不是 404 Not Found。

经过又一次 Google,最终找到了如下的完美解决方案:

RewriteEngine on

# 移除 URL 中的 .html
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^(.+?)/?$ $1.html [L]

# 访问 example.com/foo.html 301重定向到 example.com/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ ([^.]+)\.html [NC]
RewriteRule ^ %1 [R=301,L]

详细解释