.htaccess移除URL的.html后缀:目录与文件区分问题解决
解决方案
修改后的.htaccess配置如下:
DirectoryIndex index.html <IfModule mod_rewrite.c> RewriteEngine On # 处理带尾部斜杠的请求,优先匹配对应的.html文件(比如/products/ 匹配 products.html) RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_URI} ^(.+)/$ RewriteCond %{DOCUMENT_ROOT}/%1.html -f RewriteRule ^(.+)/$ $1.html [L] # 无后缀请求匹配.html文件(比如/products 匹配 products.html,/products/example2 匹配 products/example2.html) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^\.]+)$ $1.html [NC,NE,L] # 将.html后缀的请求永久重定向到无后缀路径 RewriteCond %{THE_REQUEST} \s/([^.]+)\.html[\s?] [NC] RewriteRule ^ %1 [R=301,L] </IfModule>
关键修改说明:
新增带斜杠请求的处理规则:
- 当请求指向一个实际存在的目录(比如
/products/),先检查根目录下是否存在同名的.html文件(products.html) - 如果存在该文件,直接内部重写到该
.html,而非进入目录 - 这条规则不会影响目录内的正常请求(比如
/products/example2/),因为目录内的请求不会匹配到根目录下的同名.html文件
- 当请求指向一个实际存在的目录(比如
保留原有核心规则:
- 无后缀的请求(如
/products或/products/example2)依然正常匹配对应的.html文件 - 带
.html后缀的请求仍会被301重定向到无后缀路径,保证URL规范和SEO友好
- 无后缀的请求(如
原配置失效原因:
原配置中,当请求/products/时,%{REQUEST_FILENAME}是实际存在的products目录,因此RewriteCond %{REQUEST_FILENAME} !-d条件不满足,第一条重写规则不触发。服务器默认会尝试访问该目录的索引文件(如index.html),若目录内无索引文件,则直接显示目录列表。
内容的提问来源于stack exchange,提问作者IBOX
相关产品推荐
相关产品推荐

