在MVC路由器的url重写发生后,为什么在PHP中使用$\u SERVER['REQUEST\u URI']而不是$\u GET['url']呢? Apache2.4.x

在MVC路由器的url重写发生后,为什么在PHP中使用$\u SERVER['REQUEST\u URI']而不是$\u GET['url']呢? Apache2.4.x,php,apache,mod-rewrite,url-rewriting,Php,Apache,Mod Rewrite,Url Rewriting,如果我在我的httpd-vhosts.conf中建立一个重写规则,该规则包含在我的主httpd.conf中,在一个块中,就像我看到的一些示例和教程所做的那样,这不是我的想法: RewriteRule ^(.*)$ /public/www/foo.com/public/index.php?url=$1 [QSA,L] 1我是否需要指定绝对路径似乎如此,因为RewriteBase在这种情况下不合适?它是这样工作的,但我只是想知道是否有什么我忽略了。然而,它之所以这样做,是因为一个可疑的建议似乎是不

如果我在我的httpd-vhosts.conf中建立一个重写规则,该规则包含在我的主httpd.conf中,在一个块中,就像我看到的一些示例和教程所做的那样,这不是我的想法:

RewriteRule ^(.*)$ /public/www/foo.com/public/index.php?url=$1 [QSA,L]
1我是否需要指定绝对路径似乎如此,因为RewriteBase在这种情况下不合适?它是这样工作的,但我只是想知道是否有什么我忽略了。然而,它之所以这样做,是因为一个可疑的建议似乎是不可接受的

<Directory />
    AllowOverride none
    Require all granted    ---> original setting: Require all denied
</Directory>
2我看到一些人使用$\u SERVER['REQUEST\u URI']而不是$\u GET['url']。这样做有什么好处或好处吗? 我在Stackoverflow代码回顾中读到一些地方,$\u服务器['REQUEST\u URI']将接收URL编码的值。所以,我测试了一下,发现这是真的

为了http://www.foo.com/hi/there/

$\u服务器 。。。您将在$\u服务器['REQUEST\u URI']中获得此信息

这是在$\u服务器['SCRIPT\u NAME']

美元 3我想使用没有%22的值,这是错的吗?我的意思是,我想通过我的过滤器发送输入,而不是%22的值,这是错误的吗?例如,我使用FILTER_SANITIZE_URL和FILTER_VALIDATE_URL等技术来验证URL

注意:在建立了一个集中式index.php之后,我在INPUT_服务器上的过滤器(只有6或7个元素)开始使所有6或7个元素失败。我使用filter\u input\u array有人经历过类似的事情吗?我能弄明白。它是在实现上面的重写规则之后才开始发生的

在MVC路由器发生url重写后,为什么有人会在PHP中使用$\u SERVER['REQUEST\u URI']而不是$\u GET['url']呢

因为使用您的方法意味着我的应用程序中任何地方都不能有url的查询字符串参数,如果我忘记了这一点,我会变得很奇怪,很难诊断行为。诊断为什么提交?url=google.com给我一个404不会有多大乐趣

Laravel的.htaccess规则只是:

RewriteRule ^ index.php [L]
它将从$\u服务器['REQUEST\u URI']获取路由,并相应地对其进行解析

我是否需要指定绝对路径,因为RewriteBase在这种情况下不合适

不,您不应该这样做,因此您的代码可以移植到文件可能位于不同位置的其他服务器

3我想使用没有%22的值,这是错的吗


是的,你是。不要在routes中使用无效的未转义字符。

简单的回答是,$\u GET['url']在PHP中不存在。您需要有一个完整的框架设置,并以您想要的方式配置,这样的值才能存在

在您的情况下,您有一些MVC路由器设置。因此,您应该使用$_GET['url'],因为它似乎是由您正在使用的任何框架解析的

如果要创建没有依赖项或框架的新PHP脚本,$\u GET['url']将是未定义的

我更喜欢这样分析路由:

// Parse Request
$route = "";
$routes = [];
$url_components = explode('/', $_SERVER['REQUEST_URI']);
foreach($url_components as $key => $val)
{
    if(empty($val))
    {
        if(!$key)continue;
        $route .= 'index/';
        continue;
    }

    $routes[] = $val;
    $route .= "$val/";
}

// Examine Result
$_GET['url'] = $route;
echo "Route: $_GET[url]\n";
echo "Routes Array: <pre>".var_export($routes, true)."</pre>";

希望这有帮助。

感谢您抽出时间回答。我想,按照惯例,人们只是在复制别人用mod_rewrite重写URL的方法,因为很容易找到脚本。但是,对我来说,问题不是爆炸请求URI,而是在尝试该操作之前确保请求URI代表良好的数据。也就是说,谢谢您的回复。@AnthonyRutledge但是,这是否意味着您将使用无效的转义URL字符?绝对地示例:我没有使用.htaccess。我在httpd vhosts.conf@AnthonyRutledge中使用一个块,好吗?这并没有改变这个答案中的任何东西。事实上,它确实改变了。例如。Lavarel的重写规则在块内不起作用。但是,我正在用.htaccess.Lavarel的重写规则测试它,在一个块内无法工作。当然有。您只需将public/添加到规则中,因为它默认为文档根目录。
[QUERY_STRING] => url=/hi/there" <---probably URL decoded?
[SCRIPT_NAME] => /hi/there"      <---probably URL decoded?
[SCRIPT_URL] => /hi/there"       <---probably URL decoded?
[url] => /hi/there/"  <---probably URL decoded.
RewriteRule ^ index.php [L]
// Parse Request
$route = "";
$routes = [];
$url_components = explode('/', $_SERVER['REQUEST_URI']);
foreach($url_components as $key => $val)
{
    if(empty($val))
    {
        if(!$key)continue;
        $route .= 'index/';
        continue;
    }

    $routes[] = $val;
    $route .= "$val/";
}

// Examine Result
$_GET['url'] = $route;
echo "Route: $_GET[url]\n";
echo "Routes Array: <pre>".var_export($routes, true)."</pre>";