我目前有两条规则可以正常运行,但我觉得它们可以合并为一条,以便维护更小的配置和更少的规则来处理每个 HTTP 请求。规则:
RewriteRule ^/user/[0-9]+/?$ /index.php [NC,QSA,L]
RewriteRule ^/user/[0-9]+/(.*)$ /$1 [NC,QSA,L]
我必须添加第一个带有显式重定向的规则,/index.php
因为例如,去http://www.example.com/user/5/
会给我一个 HTTP 400。重写将在内部重写到/
,但不是读取 DirectoryIndex,而是index.php
error_log 会给我:client denied by server configuration: /
。
将显式重定向添加到/index.php
诸如http://www.example.com/user/5/
第二条规则之类的固定 URL 将适用于其他所有内容。
有没有办法将配置设置为正常使用DirectoryIndex
我设置的而不是在这里明确列出 index.php?http://www.example.com
没有重写规则就可以正常工作,所以我不完全确定为什么重写会破坏它。
您可以结合使用这 2 个规则。我认为这些规则位于 VHost 配置文件或另一个配置文件中,但不在 .htaccess 中,也不在 VHost 配置内的 Directory 部分中。这意味着您处于每个服务器上下文中。
问题:
在每个服务器上下文中,替换(重写的最后一部分)可以是文件系统路径或 URL。
Apache 会尝试猜测您是指 URL 还是文件系统路径。RewriteRule 文档指出:
因此,您的规则 nr 2 将以 /user/[0-9]/ 开头的所有内容重写为 /。现在您可以看到文件系统中存在路径 /(没有名称的路径)。但当然,您对该目录的访问权限受到限制,因此您拥有
client denied
.解决方案:
删除第一条规则,使用 index.php 和
使用PT 标志(直通):
或者在您的替换中更具体:
希望这可以帮助!