尽管没有有意的输入,$ _GET变量仍被设置为某个东西

时间:2016-03-20 02:49:55

标签: php .htaccess

我正在尝试设置一个REST API,当URL说出来时,例如,api/family它会返回一个带有该信息的JSON对象。但是,当我在正斜杠之后没有任何内容api/时,我被告知isset($_GET['url'])true。我已经尝试修剪数组,因为我最初认为它是一些空白区域,但事实并非如此。通常,PHP代码是:

if (isset($_GET['url'])) {
   echo "WRONG";
}

虽然我认为不是这样,我可能会错误地设置htacess,但这是我能想到的另一件可能影响{{1}的事情。变量(即使它不应该)。

$_GET

任何有助于发现<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule api/(.*)$ api/api.php?url=$1 [QSA,NC,L] </IfModule> 输出为真的原因都将受到赞赏。

3 个答案:

答案 0 :(得分:1)

正如通过评论所述,您基本上是通过url规则将RewriteRule api/(.*)$ api/api.php?url=$1 [QSA,NC,L]设置为空值。

您可以尝试检查url的内容,例如通过if(empty($_GET['url'])empty($_GET['url'])。在这种情况下,使用isset($_GET['url'])会返回true,因为url已设置,只是没有保留实际定义。

@PanamaJack在更改RewriteRule本身时提供了很好的建议,这将成为一个更长期和更大范围的解决方案。

答案 1 :(得分:0)

请尝试检查

if ($_GET['url']=='') {
    echo "WRONG";
}

或isset as

if (isset($_GET['url'])) {
    if ($_GET['url']=='') {
        echo "WRONG";
    }
}

答案 2 :(得分:0)

更好的是,不允许重写规则为空值。这将使它不会重写到您的api URL,除非那里有实际值。

更改重写模式中的正则表达式
RewriteRule api/(.*)$ api/api.php?url=$1 [QSA,NC,L]

到此

RewriteRule api/(.+)/?$ api/api.php?url=$1 [QSA,NC,L]

你仍然可以if(!empty($_GET['url']))确保它不是,但它绝不应该是因为apache不会重写它,除非那里有值。