![](/img/trans.png)
[英]PHP routing not working unless using an absolute path with index.php
[英]Pros/cons of using index.php?q=path/ instead of index.php/path/ when routing URLs?
我正在编写一个简单的方法来将路由映射到文件,并且遇到了两种方法。
我猜想大多数框架都使用第一个方法,即使用$ _SERVER ['REQUEST_URI']变量提取index.php之后的所有内容:
RewriteRule ^(.*)$ index.php [QSA,L]
第二种方法在Drupal中使用,并且该路由只是作为查询字符串传递。
RewriteRule ^(.*)$ index.php?q=$1 [QSA,L]
现在,“ Drupal方式”对我来说似乎简单得多。 使用另一种方法,您必须在$ _SERVER ['REQUEST_URI']和$ _SERVER ['SCRIPT_NAME']上都使用“ explode”,然后使用array_diff_assoc之类的东西来删除脚本名称和子目录名称(如果有的话)。 这不是很多工作,但是如果使用Drupal方式可以简单地提取$ _GET ['q']值,为什么没有人这样做呢? 有什么不利条件?
谢谢。
使用q
参数的缺点是,如果不重写URL,则URL看起来像...
http://domain.com/?q=something
与清洁剂(IMO)相对
http://domain.com/index.php/something
使用url进行重写的一种方法或另一种方法没有巨大的优点或缺点。 但是,我会指出包括最后斜杠在内的所有内容,并将其存储在_SERVER[PATH_INFO]
,因此不必解析请求URI。
之所以使用较短的URL技术,主要是因为它具有更清洁的技术和更好的SEO。 搜索引擎将这两个URL视为“相同”:
我没有很好的解释,所以这里有一些链接,上面有一些非常好的信息:
现在,有些人以不同的方式实现了较短的URL,但这就是我发现它们最适合我的方式:
在.htaccess中
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
在index.php(或其他一些php文件)中
if(isset($_GET['route']) && $_GET['route'] != NULL && strlen($_GET['route']) > 0)
{
$split = explode('/', $_GET['route']);
for($i=1; $i <= count($split)-1; $i++)
{
$_GET[$i] = $split[$i];
}
}
然后,您可以使用$ _GET ['1'](或$ _GET [1])以及所有后续数字。
URL如下所示:
http://www.domain.com/?b=something
变成
http://www.domain.com/something
http://www.domain.com/?b=something&a=hello&c=blah
变成
然后可以通过以下方式访问参数:
$_GET[1] = "something";
$_GET[2] = "hello";
$_GET[3] = "blah";
希望有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.