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_URL
和FILTER_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>";
希望这有帮助。