mod_rewrite 将这两个规则合并为一个

mod_rewrite 将这两个规则合并为一个

我有两条规则,它们目前运行正常,但我觉得可以将它们合并为一条,这样可以减少需要维护的配置,减少每个 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.phpclient 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]

希望这可以帮助!

相关内容