请求URI对应目录存在时,.htaccess重写至文件失效的解决方法
问题解决:目录存在时优先重写至指定分页文件
问题原因分析
你的现有规则存在两个核心问题,导致重写未触发,进而返回403错误:
- RewriteRule匹配模式错误:在
.htaccess文件中,规则的路径是相对当前目录的,开头的^/永远匹配不到请求路径(比如请求/subdir/en/projects,在/subdir/en/.htaccess中实际匹配的路径是projects,不带前置斜杠)。 - 规则未优先处理目录场景:Apache默认会优先访问实际存在的目录,而非触发重写;同时原规则中
%1引用的是整个REQUEST_URI(包含/subdir/en/前缀),即便规则触发,生成的文件路径也会错误。
修正后的.htaccess配置
将原规则替换为以下配置,确保目录存在时优先触发重写:
DirectoryIndex disabled Options -MultiViews -Indexes DirectorySlash Off RewriteEngine on # 处理请求路径为实际目录且带page参数的情况 RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{QUERY_STRING} ^page=([0-9]+)$ [NC] RewriteRule ^([^/]+)$ $1_page=%1.html [L,R=307,QSD] # 可选:处理非目录但不带.html后缀且带page参数的请求 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !\.html$ [NC] RewriteCond %{QUERY_STRING} ^page=([0-9]+)$ [NC] RewriteRule ^([^/]+)$ $1_page=%1.html [L,R=307,QSD]
配置说明
RewriteCond %{REQUEST_FILENAME} -d:检查当前请求的路径是否为实际存在的目录,确保优先处理目录场景。^([^/]+)$:捕获当前目录下的一级路径(比如projects),作为文件名前缀。%1:提取查询字符串中的页码数字(比如page=2中的2)。[L,R=307,QSD]:L表示执行完这条规则后停止后续规则;R=307是临时重定向,保留请求方法;QSD丢弃原查询字符串,避免重写后URL带多余参数。
验证效果
当请求http://localhost:8888/subdir/en/projects?page=2时,会被正确重定向到http://localhost:8888/subdir/en/projects_page=2.html,不会再出现403错误或目录列表。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

