使用mod_rewrite重定向和重写

时间:2011-03-28 23:19:08

标签: apache .htaccess mod-rewrite redirect query-string

在提出这个问题之后:Clean URLs for search query?我尝试了一些mod_rewrite:

RewriteCond %{QUERY_STRING} ^s=([a-z]+)$ [NC]
RewriteRule / /s/$1? [NC,R=301,L]

RewriteRule ^s/([a-z]+)$ /?s=$1 [NC,L]

目标是什么?

  1. http://example.com/?s=query重定向到http://example.com/s/query
  2. http://example.com/s/query重写为http://example.com/?s=query
  3. 这看起来像是双重工作但是如果你仔细看看你会看到我试图完成的事情:

    1. 将任何搜索查询字符串重定向到更清晰的对象(无论是表单,还是直接输入的人)
    2. 将该URL重写(不重定向)回动态查询字符串,以便我可以通过$ _GET获取它
    3. 如果我这样考虑它应该是可能的。 所以我想寻求有经验的改编版的帮助来帮助我解决这个问题。

      Number 2有效,但就是这样。

1 个答案:

答案 0 :(得分:1)

这应该可行,我用一些不同的名字和dirs进行测试,但在你的情况下这应该没问题。

注意:对于来自RewriteCond的匹配组,您必须使用%1而不是$1

RewriteCond %{QUERY_STRING} ^s=([a-z]+)$ [NC]        
RewriteRule ^$ /s/%1? [NC,R,L]                     

RewriteRule ^s/([a-z]+)$ /?s=$1 [NC,L] 

编辑调试(参见注释):

我的测试是:

| /
| --> doc
|   |
|   --> doc.php (takes doc as GET parameter)
|     | index.php

我的apache重写是

RewriteCond %{QUERY_STRING} ^doc=([a-z]+)$ [NC]
RewriteRule ^$ /doc/%1? [NC,R,L]

RewriteRule ^doc/([a-z]+)$ /doc/doc.php?doc=$1 [NC,L]

然后要求domain.com/?doc=query显示doc is query

适合我。