You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求URI对应目录存在时,.htaccess重写至文件失效的解决方法

问题解决:目录存在时优先重写至指定分页文件

问题原因分析

你的现有规则存在两个核心问题,导致重写未触发,进而返回403错误:

  1. RewriteRule匹配模式错误:在.htaccess文件中,规则的路径是相对当前目录的,开头的^/永远匹配不到请求路径(比如请求/subdir/en/projects,在/subdir/en/.htaccess中实际匹配的路径是projects,不带前置斜杠)。
  2. 规则未优先处理目录场景: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:49:56