同名work.html与work目录时example.com/work访问404的.htaccess问题咨询
问题分析与解决方案
问题出在服务器优先级和现有规则的条件限制:
- 访问
example.com/work时,服务器会优先查找名为work的目录,而你现有规则的第一条RewriteCond %{REQUEST_FILENAME} !-d(意为“请求路径不是目录”)会跳过这条请求的重写逻辑。 - 由于
work目录内没有默认索引页(比如index.html),服务器返回404;而直接访问work.html时,规则会正常匹配(请求路径不是目录,且存在对应的.html文件)。
解决方案
你需要添加额外规则处理这种“目录名与同名.html文件冲突”的情况,以下两种方案任选其一:
方案一:通用规则(适配所有类似场景)
调整规则顺序,先处理请求为目录但存在同名.html文件的情况,再执行原有规则:
RewriteEngine on # 若请求的是目录,且存在同名的.html文件,则重写到该html RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.*)/$ $1.html [NC,L] # 原有规则:请求不是目录且存在对应.html文件时重写 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.*)$ $1.html [NC,L]
方案二:针对性规则(仅处理/work)
直接为/work添加单独的重写规则,放在原有规则之前:
RewriteEngine on # 匹配/work或/work/,重写到work.html RewriteRule ^work/?$ work.html [NC,L] # 原有规则 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.*)$ $1.html [NC,L]
两种方案都能解决example.com/work的404问题,且不影响example.com/work/piece1等子页面的正常访问。
内容的提问来源于stack exchange,提问作者Owen Vera Lara
相关产品推荐
相关产品推荐

