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

我有两个目前正在运行的规则,但我觉得可以将它们整合到一个中,以便维护较小的configuration,并为每个HTTP请求处理更less的规则。 规则:

RewriteRule ^/user/[0-9]+/?$ /index.php [NC,QSA,L] RewriteRule ^/user/[0-9]+/(.*)$ /$1 [NC,QSA,L] 

我不得不添加第一个规则显式redirect到/index.php因为去http://www.example.com/user/5/ ,例如,会给我一个HTTP 400.重写将内部重写/ ,而不是阅读DirectoryIndex, index.php ,error_log会给我: client denied by server configuration: /

将明确的redirect添加到/index.php固定的URL(例如http://www.example.com/user/5/ ,第二条规则将适用于其他所有内容。

有没有一种方法来设置configuration通常只使用DirectoryIndex我已经设置,而不是明确列出index.php在这里? http://www.example.com工作得很好,没有重写规则,所以我不完全确定重写为什么会打破它。

你可以结合这两个规则。 我认为这些规则位于VHostconfiguration文件或其他configuration文件中,但不在.htaccess中,也不在VHostconfiguration中的目录部分。 这意味着你在每个服务器上下文中。

问题:

在每个服务器上下文中,replace(重写的最后部分)可以是文件系统path或URL。

Apache试图猜测你的意思是URL还是文件系统path。 RewriteRule文档指出:

在服务器(虚拟主机)上下文中configuration规则时,replace仅作为文件系统path处理,replace中的第一个组件位于文件系统中

所以你的规则2重写了以/ user / [0-9] / /开头的所有内容。 现在你可以看到path/(没有名字的path)存在于文件系统中。 但是,当然你有限制访问该目录,所以你有client denied

解决scheme:

删除第一个规则,用index.php和

使用PT标志(passthrough) :

 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] 

希望这可以帮助!