如果您想要/post/3/users/
转到/Users.php?id=3
,您必须将该规则放在现有规则之前。您现有的规则匹配/post/3/'
,该规则是此附加规则匹配内容的前缀,因此如果该规则在之后,则该规则永远不会触发。
# catch the longer URL first
RewriteRule ^post/([A-Za-z0-9-]+)/users/?$ Users.php?id=$1 [NC,L]
# No /users/ on it; rewrite to post.php
RewriteRule ^post/([A-Za-z0-9-]+)/?$ post.php?id=$1 [NC,L]
另一件事:你用.htaccess
标记你的文章。这是否意味着您的重写是在.htaccess
?如果是这样,你应该使用RewriteBase
,因为你的重写是相对的。为什么它的工作原理可能是你允许web服务器上的路径和URL之间的1:1对应。
在像.htaccess
这样的按目录的上下文中,mod_rewrite正在处理路径名称,而不是URL。但是如果你做了一次相对重写,路径就会变成一个URL并且反馈到Apache的请求处理链中再次处理。如何将路径转换为URL是将RewriteBase
的内容添加到前面。如果你没有RewriteBase
,那么会发生一件愚蠢的事情:你的目录的路径(RewriteRule
已被删除!)。
示例:假设您的DocumentRoot为/var/www
。假设浏览器请求URL /foo
。它只是需要/var/www/
目录剥离下来并把它放回:此获取如果.htaccess
为/var/www/
里面你重写foo
到bar
(和RewriteBase
未设置),则说明mod_rewrite将生成URL /var/www/bar
转换为路径/var/www/foo
。现在可以开始工作了:只需使/var/www/
有效的URL到达该目录即可。例如与
Alias /var/www /var/www # map /var/www URL to /var/www directory
但这是hacky。正确的方法是在.htaccess中有RewriteBase /
。所以当foo
被改写为bar
时,它只是在前面得到/
并且变成了url /bar
。这被反馈给服务器,并且将“自然地”重新解析回文档根目录。
在我了解重写之前,我使用了这样的黑客。我甚至使用/
作为DocumentRoot
!这使得所有东西都可以正常工作,因为大多数URL都是路径:您不必将URL看作是与文件系统路径分开的抽象。但这是一件危险而愚蠢的事情。
来源
2012-03-11 22:16:21
Kaz
所以'/ post/3 /'必须转到'/post.php?id=3'。这样可行。但'/ post/3/users /'也应该转到'/Users.php?id = 3'? – Kaz 2012-03-11 22:14:30