URL重写:htaccess的多个规则

问题描述:

请帮忙解决这个问题URL重写:htaccess的多个规则

RewriteEngine On 
ErrorDocument 400 /tmp/error/404.html 
ErrorDocument 401 /404.html 
ErrorDocument 403 /404.html 
ErrorDocument 404 /404.html 
ErrorDocument 500 /404.html 
RewriteBase/
DirectoryIndex index.php 
RewriteRule ^([0-9a-z\-\_]+)?$ /index.php?url=$1 [L,QSA,NC] 
#RewriteRule ^showthread.php?t=([0-9]+)/?$ /vb/showthread.php?t=$1 [NC] 

所有规则工作,但评论规则,我可以把它写

你可以帮我写这个规则

我想这条道路/showthread.php?t=[0-9]重定向到/vb/showthread.php?t=[0-9]

与出亲bleo在seo?

RewriteCond %{QUERY_STRING} ^t=(\d+)$ 
RewriteRule ^showthread\.php /vb/showthread.php?t=%1 [NC] 

参考:http://wiki.apache.org/httpd/RewriteQueryString

注,每有所示好例子,这只会如果t是在查询字符串的唯一参数的工作 - 但它可以扩展到允许其他人也如:

RewriteCond %{QUERY_STRING} (?:^|&)t=(\d+)(?:&|$) 
RewriteRule ^showthread\.php /vb/showthread.php?t=%1 [NC] 

(我所做的仅仅是测试,它似乎没有问题的工作。)

另外,如果你想这REDIR ect,而不是只是将请求代理到其他php文件,您需要在RewriteRule的末尾添加类似[R=301]的内容。

+0

你的答案很好,但是我可以不用** RewriteCond ** – 2011-12-31 15:48:22

+0

不,你需要'RewriteCond'。根据http://wiki.apache.org/httpd/RewriteQueryString,“RewriteRule不能直接访问查询字符串...” – ziesemer 2011-12-31 15:51:44

我看到的一个问题是,你写了^ showthread.php?t =([0-9] +)/?$作为正则表达式。正则表达式(点)意味着任何事情都可以。尝试改变与该注释行,

RewriteRule ^showthread\.php?t=([0-9]+)/?$ /vb/showthread.php?t=$1 [NC] 

另一件事是,

RewriteRule ^([0-9a-z\-\_]+)?$ /index.php?url=$1 [L,QSA,NC] 

这一行需要直接的所有请求,并重定向到的index.php。因为你在正则表达式中说,即使它是空的,再次将请求发送到index.php。或者也许你忘记了/(斜线)之前? (问号)。不要把这些变化,正则表达式的意思。

+0

我们不需要使用'RewriteCond'来匹配查询字符串吗? – ziesemer 2011-12-31 15:14:47

+0

通过在RewriteRule或RewriteCond中编写正则表达式,它们都可以解决问题。 – tcak 2011-12-31 15:48:28

+0

谢谢,但它没有与我一起工作? – 2011-12-31 15:48:53