2012-03-11 50 views
0

我需要专家的帮助。Url Mod-Rewrite用ID获取新页面

我有一些重写规则:

post.php go to http://example.com/post/3/ 
RewriteRule ^post/([A-Za-z0-9-]+)/?$ post.php?id=$1 [NC,L] 

它的作品!

但是,我怎么可以添加新的重写规则到新页面Users.php后/ ID/ 后在Users.php获得ID(Users.php?ID = 3)

筛选http://example.com/post/3/users

谢谢!

+0

所以'/ post/3 /'必须转到'/post.php?id=3'。这样可行。但'/ post/3/users /'也应该转到'/Users.php?id = 3'? – Kaz 2012-03-11 22:14:30

回答

3

如果您想要/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/里面你重写foobar(和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看作是与文件系统路径分开的抽象。但这是一件危险而愚蠢的事情。

+0

工程就像一个魅力!谢谢! – Mark 2012-03-11 22:26:42