由于URL重写,PHP $ _GET变量为空

时间:2014-07-06 11:03:54

标签: php html apache .htaccess mod-rewrite

我用.htaccess重写了一个URL,使它看起来更漂亮。 但是当我向这个URL添加一个查询字符串时,这些键在PHP中是不可见的。

在我的.htaccess文件中,我尝试了几个方法来解决问题,但没有任何效果。

RewriteEngine On
[some code]
RewriteRule ^([a-zA-Z0-9_-]+)/?$ ?site=$1

我尝试过这种重写,看它是否有效:

RewriteRule ^search?q=g ?site=search&q=g

但如果我在PHP中使用print_r($_GET),我将获得Array ( [site] => search ) 试试http://kwtsports.bplaced.de/search?q=g

我有一个重定向到/search?q=blablaSearchQuery的搜索字段,但正如我所说,$_GET['q']是空的。

这也不起作用:

RewriteRule ^search?q=([a-zA-Z0-9_-]+)/?$ ?site=search&q=$1

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:3)

[QSA]添加到RewriteRule的末尾。这会将旧查询字符串附加到结果中。

有关详细信息,请参阅docs

答案 1 :(得分:1)

  

有谁知道,为什么会这样?

是。您无法在重写规则中测试查询字符串,因此规则的这一部分将无法运行:RewriteRule ^search?q=g

如果要测试查询字符串,则必须在重写cond中对其进行测试。

例如,对于您的RewriteRule ^search?q=g?site=search&q=g示例,您必须执行以下操作:

RewriteCond %{QUERY_STRING} ^q=([^&]+)
RewriteRule ^search/?$ site=search&q=%1 [L]

在这种特殊情况下,由于您不想更改q值,因此我们不需要对其进行测试,您可以在添加后使用QSA选项简单地通过它site=search

RewriteRule ^search/?$ site=search [L,QSA]