如果你是 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]