.htaccess重写规则误将目录识别为分类,如何排除真实目录?
解决.htaccess重写规则误识别真实目录的问题
你遇到的核心问题是:当前的重写规则会匹配所有符合字符模式的路径,但没有优先排除真实存在的目录和文件,所以才会把真实目录错误解析成分类/子分类参数。我给你整理了一套靠谱的解决方案:
第一步:先排除真实存在的文件和目录
在所有重写规则最前面添加以下代码,让Apache优先处理真实存在的资源,跳过后续重写规则:
# 跳过真实存在的文件 RewriteCond %{REQUEST_FILENAME} -f [NC] RewriteRule .* - [L] # 跳过真实存在的目录 RewriteCond %{REQUEST_FILENAME} -d [NC] RewriteRule .* - [L]
这段代码的逻辑很简单:如果请求的路径对应服务器上真实存在的文件或目录,直接返回原内容,不再执行后面的重写规则。
第二步:优化原有重写规则
把你原来的规则放在上面的排除规则之后,同时做一点小优化(比如让子分类路径支持可选的结尾斜杠,并且去掉不必要的转义符):
# 匹配单分类路径(例如 /tech 或 /tech/) RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?category=$1 [NC,L] # 匹配分类+子分类路径(例如 /tech/smartphones 或 /tech/smartphones/) RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?category=$1&subcategory=$2 [NC,L]
可选:快速排除特定静态资源目录
如果你的站点有/css、/js、/images这类静态资源目录,还可以在最前面加一条规则直接跳过这些目录的重写,提升处理效率:
# 直接跳过静态资源目录的重写 RewriteRule ^(css|js|images)/ - [L,NC]
把这些规则按顺序放在你的.htaccess文件里,就能完美解决真实目录被误识别的问题了——只有当请求的路径不存在时,才会触发分类/子分类的重写逻辑。
内容的提问来源于stack exchange,提问作者Prashant Rajpoot
相关产品推荐
相关产品推荐

