$ _GET动态方法调用失败为index.php

时间:2016-07-20 05:26:23

标签: php .htaccess mod-rewrite

这是我的.htaccess

RewriteBase /action
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^(.*)$ action.php?fid=$1 [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ action.php [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^(.*)$ action.php [QSA,NC,L]  

因此,它位于文件夹/action

现在可以将文件http://domain/action/action.php?fid=称为http://domain/action/{fid},其中fid是函数名称,如下所示:

<?php 
class Actions{

    function call($func){
        if(method_exists($this, $func) == true){
            $this->$func();
        } else {
            http_response_code(403);
            echo "403 Forbidden";
        }
    }

    private function deleteFile(){
        if(isset($_POST['auth'])){
            if(!cookie_login($_POST['auth'])){
                echo '403';
            } else {
                if(isset($_POST['token'])){
                    if(delete_file($_POST['token'])){
                        echo '200';
                    } else {
                        echo '500';
                    }
                } else {
                    echo '404';
                }
            }
        } else {
            echo '404';
        }
    }
}

print_r($_GET);
$action = new Actions();
$action->call($_GET['fid']);

现在我按deleteFile()方式调用http://domain/action/deleteFile方法,根据代码$_GET['fid']等于deleteFile

但是,这种情况并没有发生。

案例1输出:

方法:POST

网址:http://domain/action/deleteFile

Array
(
    [fid] => index.php
)
403 Forbidden

案例2输出:

方法:GET

网址:http://domain/action/deleteFile

Array
(
    [fid] => deleteFile
)
404

描述:这里没有POST参数,这就是为什么它回显404,但方法正在执行。

尝试1:$_GET$_POST更改为$_REQUEST

结果不会改变。

现在查看案例1输出

fid应该是deleteFile,但它是index.php。如果我注释掉$this->$func();方法中的Action->call($func),那么就是输出。

方法:POSTGET

网址:http://domain/action/deleteFile

Array
(
    [fid] => deleteFile
)

表示,只有当$this->$func();中有Action->call($func)这一行时,它才会出现故障。 index.php来自哪里?怪异!!

我真的不知道这个问题。请帮忙。

1 个答案:

答案 0 :(得分:2)

您的cookie_login函数似乎可能正在弄乱$_REQUEST['fid']变量。当我在本地开发实例中将其旋转时,所有其他代码似乎都按预期工作。