为什么在 MVC 路由器发生 URL 重写后,在 PHP 中使用 $_SERVER['REQUEST_URI'] 而不是 $_GET['url']?



Apache (2.4.x)

如果我在我的httpd-vhosts.conf中建立一个重写规则(包含在我的主要httpd.conf中),在一个<VirturalHost>块中,如下所示(正如我看到的一些示例和教程所做的那样,而不是我的想法):

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>

这似乎是令人发指的缺陷和宽容(似乎)。我真的需要研究实现Require运行时指令的模块(我认为是mod_access)。

这足够了吗(在<VirtualHost>块内对我不起作用)?将重写规则放在 .htaccess 中以便它们与应用程序一起传输(而不是耦合到服务器)是否更好?

RewriteRule ^(.*)$ index.php [L]  -->Wihout QSA, Query String Append

2)我看到有些人使用$_SERVER['REQUEST_URI']而不是$_GET['url']。这样做有什么好处或好处吗? 我在Stackoverflow代码审查中读到了一些$_SERVER['REQUEST_URI']将接收URL编码值的位置。所以,我测试了它,发现这是真的

对于http://www.foo.com/hi/there/"...

$_SERVER

。你会得到这个在你的$_SERVER['REQUEST_URI']

[REQUEST_URI] => /hi/there%22    <---definitely URL encoded.

。这在$_SERVER['QUERY_STRING']

[QUERY_STRING] => url=/hi/there" <---probably URL decoded?

这在$_SERVER['SCRIPT_NAME']

[SCRIPT_NAME] => /hi/there"      <---probably URL decoded?

。而且,这在$_SERVER['SCRIPT_URL']

[SCRIPT_URL] => /hi/there"       <---probably URL decoded?

$_GET

[url] => /hi/there/"  <---probably URL decoded.

3)我想在没有%22的情况下使用这些值是错的吗?我的意思是,"我是否想通过我的过滤器发送该输入,而不是带有%22的值"例如,我使用FILTER_SANITIZE_URLFILTER_VALIDATE_URL(以及其他技术)来验证 URL。

注意建立集中式索引.php后,我对INPUT_SERVER(只有 6 或 7 个元素)的过滤器开始失败(所有 6 或 7 个)。我使用filter_input_array()有人遇到类似的事情吗?我能想通。在实施上述重写规则后,它才开始发生

为什么在 MVC 路由器发生 URL 重写后,有人会在 PHP 中使用 $_SERVER['REQUEST_URI'] 超过 $_GET['url']?

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

拉拉维尔的.htaccess法则只是:

RewriteRule ^ index.php [L]

它将从$_SERVER['REQUEST_URI']获取路由,并相应地对其进行解析。

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

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

3)我想使用没有%22的值是错的吗?

是的,你是。不要在路由中使用无效的未转义字符,例如"

简短的回答是 $_GET['url'] 在 PHP 中并不存在神奇的存在。您需要有一个完整的框架设置,并以您希望的方式进行配置,以便存在这样的值。

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

如果要创建一个没有依赖项或框架的新 PHP 脚本,$_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>";

希望这有帮助。

相关内容

最新更新