Url Mod-Rewrite获取带有ID的新页面

时间:2012-03-11 22:09:16

标签: .htaccess mod-rewrite

我需要专家的帮助。

我有一些重写规则:

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

有效!

但是,如何在发布/ ID /之后向NEW Page Users.php添加新的重写规则 并在Users.php(Users.php?id = 3)

中获取ID

喜欢这个http://example.com/post/3/users

谢谢!

1 个答案:

答案 0 :(得分: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?如果是这样,您应该使用.htaccess,因为您的重写是相对的。为什么它的工作可能是你允许在你的网络服务器上的路径和URL之间保持1:1的对应关系。

在像RewriteBase这样的每个目录上下文中,mod_rewrite正在使用路径名而不是URL。但是如果你进行相对重写,路径就会变成一个URL并反馈到Apache的请求处理链中,以便再次处理。如何将路径转换为URL,RewriteBase的内容将添加到前端。如果你没有RewriteRule那么就会发生一件愚蠢的事情:你的目录路径(/var/www被移除的路径刚刚重新开始!)。

示例:假设您的DocumentRoot为/foo。假设浏览器要求提供URL /var/www/foo。这会转换为路径.htaccess如果在/var/www/ foo内,您将bar重写为RewriteBase(并且/var/www/bar未设置),然后mod_rewrite将生成URL /var/www/:它只需要剥离的/var/www/目录并将其重新打开。现在可以使用了:只需将Alias /var/www /var/www # map /var/www URL to /var/www directory 一个有效的URL转到该目录即可。例如

RewriteBase /

但这很黑。正确的方法是在.htaccess中使用foo。因此,当bar重写为/时,它只会在前面获得/bar并成为网址/。这将反馈给服务器并“自然地”再次解析回文档根目录。

在我理解重写之前,我曾经使用过类似的黑客。我甚至使用DocumentRoot作为{{1}}!这使得一切顺利,因为大多数URL都是路径:您不必将URL视为与文件系统路径分开的抽象。但这是一件危险而又愚蠢的事情。