重定向/搜索?query = foo到/ search / foo

时间:2015-10-05 16:06:04

标签: .htaccess mod-rewrite rewrite

我正在尝试将/search?query=foo重定向到/search/foo,但我的所有尝试都失败了。

我在类似的问题中尝试过这些解决方案,但它们没有奏效。我相信这是因为我试图将请求重写为index.php,以便PHP框架可以处理它。

我知道导致问题的不是PHP框架,因为当我手动转到/search/foo时,它被正确处理。

我的.htaccess看起来像这样:

RewriteEngine On

RewriteCond %{REQUEST_URI} ^/search$
RewriteCond %{QUERY_STRING} ^query=(.*)$
RewriteRule ^ search/%1 [R=302,NS]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

我不明白为什么它不起作用,因为当我查看日志时URL已成功转换为我所追求的内容:

applying pattern '^' to uri 'search'
RewriteCond: input='/search' pattern='^/search$' => matched
RewriteCond: input='query=asd' pattern='^query=(.*)$' => matched
rewrite 'search' -> 'search/asd'
add per-dir prefix: search/asd -> .../app/public/search/asd
explicitly forcing redirect with http://localhost/.../app/public/search/asd

1 个答案:

答案 0 :(得分:2)

您需要摆脱查询字符串。而不是:

RewriteCond %{REQUEST_URI} ^/search$
RewriteCond %{QUERY_STRING} ^query=(.*)$
RewriteRule ^ search/%1 [R=302,NS]

尝试:

RewriteCond %{THE_REQUEST} \ /+search\?query=([^&\ ]+)
RewriteRule ^ search/%1? [L,R=302,NS]

重要部分是反向引用后的?%1。这告诉mod_rewrite new 查询字符串只是?(即没有)。此时,现有的查询字符串会自动附加到重写的URL /重定向。