我正在学习如何为.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)
答案 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以获取有关如何执行此操作的更一般性讨论。