重写搜索结果

时间:2012-04-18 06:02:28

标签: .htaccess mod-rewrite

我经历过关于mod_rewrite的每一个教程,但我无法弄明白。

我想将搜索网址从www.domain.com/?s=query重写为www.domain.com/search/query。 到目前为止,我设法使用此规则实现了这一目标:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(#[^?&\ ]*)?\?([^&\ ]*&)?s=([^&\ ]+)[^\ ]*\ HTTP/
RewriteRule ^$ http://www.domain.com/search/%3? [R=301,L]

问题在于,某些查询会导致可以通过www.domain.com/?s=query&nggpage=n访问多个搜索结果页面(其中n优于2)。

在这种情况下,我想重写一下,最后得到像www.domain.com/search/query/nggpage-n这样的网址。

不太确定如何实现这一目标。我正在寻求帮助。

1 个答案:

答案 0 :(得分:2)

我认为你必须分多步重新分解重写。这样的事情可以完成这项工作,我简化了你的条件:

  1. 检查搜索参数是否存在,重写到目标路径并为以后的测试设置env标志

    RewriteCond %{QUERY_STRING} s=([^&\ ]+)
    RewriteRule ^/?$ /search/%1 [E=redirect:true]
    
  2. 如果设置了重定向并找到了分页参数,请附加分页路径

    RewriteCond %{ENV:redirect} true
    RewriteCond %{QUERY_STRING} nggpage=(\d+)
    RewriteRule ^/(.*)$ /$1/nggpage-%1
    
  3. 删除第1页的分页

    RewriteCond %{ENV:redirect} true
    RewriteRule ^/(.*)/nggpage-1$ /$1
    
  4. 如果设置了重定向,则让我们重定向

    RewriteCond %{ENV:redirect} true
    RewriteRule ^/(.*)$ http://www.domain.com/$1? [R=301,L]