![mod_rewrite 将这两个规则合并为一个](https://linux22.com/image/648957/mod_rewrite%20%E5%B0%86%E8%BF%99%E4%B8%A4%E4%B8%AA%E8%A7%84%E5%88%99%E5%90%88%E5%B9%B6%E4%B8%BA%E4%B8%80%E4%B8%AA.png)
我有两条规则,它们目前运行正常,但我觉得可以将它们合并为一条,这样可以减少需要维护的配置,减少每个 HTTP 请求需要处理的规则。规则如下:
RewriteRule ^/user/[0-9]+/?$ /index.php [NC,QSA,L]
RewriteRule ^/user/[0-9]+/(.*)$ /$1 [NC,QSA,L]
我必须添加第一条带有明确重定向到 的规则,因为例如,/index.php
转到会给我一个 HTTP 400。重写会在内部重写为,但 error_log 不会读取 DirectoryIndex,而是会给我:。http://www.example.com/user/5/
/
index.php
client denied by server configuration: /
将显式重定向添加到/index.php
固定 URL(例如,http://www.example.com/user/5/
第二条规则)将适用于其他所有内容。
有没有办法将配置设置为通常使用DirectoryIndex
我已经设置的而不是在这里明确列出 index.php?http://www.example.com
没有重写规则也可以正常工作,所以我不完全确定为什么重写会破坏它。
答案1
您可以组合这 2 条规则。我认为这些规则位于 VHost 配置文件或其他配置文件中,但不在 .htaccess 中,也不在 VHost 配置内的目录部分中。这意味着您处于每个服务器上下文中。
问题:
在每个服务器上下文中,替换(重写的最后一部分)可以是文件系统路径或 URL。
Apache 会尝试猜测您指的是 URL 还是文件系统路径。重写规则文档状态:
仅当规则在服务器(虚拟主机)上下文中配置,并且替换中路径的第一个组件存在于文件系统中时,替换才会被视为文件系统路径
因此,规则 2 将以 /user/[0-9]/ 开头的所有内容重写为 /。现在您可以看到路径 /(没有名称的路径)存在于文件系统中。但当然,您对该目录的访问权限受到限制,因此您有client denied
。
解决方案:
删除第一条规则,其中包含 index.php 和
使用PT 标志(直通):
RewriteEngine On
RewriteRule ^/user/[0-9]+/(.*)$ /$1 [NC,QSA,L,PT]
或者在替换时更具体地说明:
RewriteEngine On
RewriteRule ^/user/[0-9]+/(.*)$ /root/and/full/path/to/www/$1 [NC,QSA,L]
希望这可以帮助!