为什么我的RewriteRule在URL中有`?`时不起作用

时间:2012-07-15 13:48:17

标签: .htaccess mod-rewrite

我正在学习如何为.htaccess重定向编写正则表达式。 到目前为止,我已经设法找出了我需要的一切,除了一些不符合我预期的正则表达式。我正在使用桌面应用程序测试我的正则表达式,它们在那里工作正常,但不在.htaccess文件中。

仅供参考:RewriteBase设置为/site/

这是传入的网址: /site/view-by-tag/politics/?el_mcal_month=3&el_mcal_year=2009

我想抓住“政治”并重定向到/site/tags/politics/

以下是我使用的内容:

RewriteRule ^view-by-tag/([a-zA-Z\-]+)/([a-zA-Z0-9\-\/\.\_\=\?\&]+) /tags/$1/ [R=301,L]

我在politics之后添加了对所有字符的捕获,因为我遇到的问题是,当URL中有?时,重定向不起作用,我无法弄清楚为什么。在上面给出的网址中,如果我删除?它可以正常工作,但如果?在那里,则没有任何反应。有这个原因吗?

当我尝试从307

捕获/site/?option=com_content&view=article&id=307&catid=89&Itemid=55时,会发生同样的事情

我使用了这个正则表达式article&id=([0-9]+) /?p=$1 [R=301,L]但是,当网址中有?时,它会停止重定向以执行任何操作。

这是什么原因?

有问题的.htaccess文件位于Wordpress博客(3.4.1)

2 个答案:

答案 0 :(得分:0)

如果您需要对RewriteCond进行操作,则必须在RewriteRule中单独处理查询字符串,并且不应在QSA内匹配,而只是匹配请求而不是包括查询字符串,并使用RewriteRule ^view-by-tag/([A-Za-z-]+)/?$ /tags/$1/ [R=301,L,QSA] # OR, if you don't want the rest of the query string appended, put a `?` onto # the redirect to replace it with nothing RewriteRule ^view-by-tag/([A-Za-z-]+)/?$ /tags/$1/? [R=301,L] 将查询字符串附加到重定向:

QSA

实际上,R重定向中可能不需要307 - 我认为默认行为是使用重定向传递查询字符串。

如果您需要从查询字符串中捕获RewriteCond,请在%1中执行并在# Capture the id in %1 RewriteCond %{QUERY_STRING} id=([\d]+) # Redirect everything to /, pass %1 into p RewriteRule . /?p=%1 [LR=301,L] 中捕获:

{{1}}

答案 1 :(得分:0)

您错过的一点是重写引擎将URI分为两部分: REQUEST_URI QUERY_STRING 。查询字符串部分未在规则匹配字符串中使用,因此构建规则正则表达式模式没有必要查找它。

您可以使用重写条件和条件regexp来设置%N 变量,从查询字符串中探测和选择参数。

默认情况下,查询字符串会附加到输出替换字符串,除非您有?someparam - 在这种情况下会被忽略,除非您使用了[QSA](查询string append)参数。

您在/site/?option=com_content&view=article&id=307&catid=89&Itemid=55中获取ID的方式是使用以下内容:

RewriteCond %{QUERY_STRING} \bid=(\d+)

在规则之前,这会将%1设置为307.阅读rewrite documentation以获取有关如何执行此操作的更一般性讨论。