mod_rewrite规则不发送$ _GET PHP参数

时间:2017-01-03 22:09:19

标签: php apache .htaccess mod-rewrite

我已经看到了其他几个类似的问题,但答案对我不起作用。希望有人能说清楚。

我有一个类似http://website.com/show/?id=9999的网址,我在页面上的PHP脚本中使用$_GET['id']。当我使用重写规则将网址转换为http://website.com/show/9999/时,$_GET['id']不再有效。

以下是我使用的重写规则:

    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^show/(.*)$ /show/?id=$1 [NC,L,QSA]

3 个答案:

答案 0 :(得分:1)

尔加!固定它。我遗漏了一个关键信息,即http://website.com/show/也通过WordPress永久链接引擎重写。 " L"我的规则中的标志是阻止WordPress重写规则再次拾取目标。

答案 1 :(得分:0)

你不想要那些重写条件。你只需要规则。这应该有效:

RewriteEngine On
RewriteRule ^show/([^/]*)$ /show/?id=$1 [L]

答案 2 :(得分:0)

$_GET['id']不再有效,因为id参数不再是get字符串的一部分。 apache重写发生在Web堆栈的下层而不是php操作,这意味着在php接管时根本不再有$_GET字符串。您可以使用var_dump($_GET);对此进行测试,并亲眼看看。

如上所述,可以通过以下方式通过$_SERVER['REQUEST_URI']访问它:

$params = explode('/', $_SERVER['REQUEST_URI']);
var_dump($params[0]); //This should print "show"
var_dump($params[1]); //This should print "9999"

您需要能够预测URL的哪个部分与您执行此操作所需的值相对应。这通常是路由器的工作。

示例:http://upshots.org/php/php-seriously-simple-router