1

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

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

这是传入的 URL: /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 中有一个时,重定向不起作用,我不知道为什么。在上面给出的 URL 中,如果我删除?它可以正常工作,但如果?它在那里,则不会发生任何事情。是否有一个原因?

当我尝试307/site/?option=com_content&view=article&id=307&catid=89&Itemid=55

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

这是什么原因?

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

4

2 回答 2

0

如果需要操作查询字符串,则必须在 a 中单独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从查询字符串中捕获,请在 a 中执行并在中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]
于 2012-07-15T14:36:08.590 回答
0

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

您可以通过使用重写条件和条件正则表达式来设置%N变量,从查询字符串中探查和挑选参数。

默认情况下,查询字符串会附加到输出替换字符串中,除非您在其中包含一个?someparam- 在这种情况下,除非您使用 [QSA](查询字符串追加)参数,否则它会被忽略。

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

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

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

于 2012-07-15T14:44:19.320 回答