我需要专家的帮助。
我有一些重写规则:
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
谢谢!
答案 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视为与文件系统路径分开的抽象。但这是一件危险而又愚蠢的事情。