mod_rewrite中的RewriteCond%{QUERY_STRING}(动态到静态URL)不起作用

时间:2012-07-18 15:21:10

标签: regex apache .htaccess mod-rewrite redirect

因为我遇到了很好的运行,因为以前只是传递查询字符串参数来管理让查询字符串正确地重定向,并且整个网站和webmasterworld的查询字符串重定向的主题建议似乎是“将其作为RewriteCond查询字符串处理”,我正在尝试将以下类型规则用于一组大约10个URL。

示例网址:

http://www.example.org/training_book.asp?sInstance=1&EventID=139

到目前为止我所拥有的:

RewriteCond %{QUERY_STRING} ^training_book.asp\?sInstance=1&EventID=139  
RewriteRule /clean-landing-url/ [NC,R=301,L]

所以,我想要发生的是

http://www.site.org/training_book.asp?sInstance=1&EventID=139 301> http://www.site.org/clean-landing-url

但是发生的事情是:

http://www.site.org/training_book.asp?sInstance=1&EventID=139 301> http://www.site.org/training_book.asp/?sInstance=1&EventID=139

它在查询字符串之前附加正斜杠,然后解析完整的URL(显然,404ing。)

我错过了什么?它是实际的%{QUERY_STRING}参数的正则表达式问题吗?

提前致谢!

编辑 -

这是我到目前为止的地方。

根据以下@TerryE的建议,我尝试实施以下规则。

我有一组包含以下参数的网址:

http://www.example.org/training_book.asp?sInstance=1&EventID=139
http://www.example.org/training_book.asp?sInstance=2&EventID=256
http://www.example.org/training_book.asp?sInstance=5&EventID=188

需要重定向到

http://www.example.org/en/clean-landing-url-one
http://www.example.org/en/clean-landing-url-two
http://www.example.org/en/clean-landing-url-three

这是我目前拥有的htaccess文件的确切结构,包括目前工作正常的“简单”重定向的完整示例(注意 - httpd中http://example.com> http://www.example.com重定向的.conf)

#301 match top level pages
RewriteCond %{HTTP_HOST} ^example\.org [NC]
RewriteRule ^/faq.asp /en/faqs/ [NC,R=301,L] 

此块中的所有URL都属于此类型。所有这些网址都完美无缺。

#Redirect all old dead PDF links to English homepage.
RewriteRule ^/AR08-09.pdf /en/ [NC,R=301,L]

此块中的所有URL都属于此类型。所有这些网址都完美无缺。

问题在于:我仍然无法获取以下类型的网址进行重定向。根据@TerryE的建议,我试图改变语法如下。以下块无法正常运行。

#301 event course pages
RewriteCond %{QUERY_STRING} sInstance=1EventID=139$
RewriteRule ^training_book\.asp$ /en/clean-landing-url-one? [NC,R=301,L]

这是

的输出
http://staging.example.org/training_book.asp/?sInstance=1&EventID=139

(目前适用于staging.example.org,将适用于example.org)

(我在初始问题中通过training_book将其更改为event_book来“隐藏”了一些实际语法,但我已将其更改为尽可能真实。)

1 个答案:

答案 0 :(得分:1)

文档。 ?后,QUERY_STRING包含请求内容。你的条件regexp永远不应该匹配。这更有意义:

RewriteCond %{QUERY_STRING}   ^sInstance=1&EventID=139$ 
RewriteRule ^event_book\.asp$ /clean-landing-url/ [NC,R=301,L]

正斜杠是由不同的Apache过滤器(DirectorySlash)引起的。