路由URL时使用index.php?q=path/而不是index.php/path/的优缺点?

路由URL时使用index.php?q=path/而不是index.php/path/的优缺点?,php,url-rewriting,url-routing,Php,Url Rewriting,Url Routing,我正在编写一个简单的方法来将路径映射到文件,我遇到了两种方法 我猜大多数框架都使用第一个变量$\u SERVER['REQUEST\u URI']来提取index.php之后的所有内容: RewriteRule ^(.*)$ index.php [QSA,L] 第二种方法在Drupal中使用,路由只是作为查询字符串传递 RewriteRule ^(.*)$ index.php?q=$1 [QSA,L] 现在,“Drupal方式”对我来说似乎简单多了。对于另一种方法,您必须在$\u服务器['R

我正在编写一个简单的方法来将路径映射到文件,我遇到了两种方法

我猜大多数框架都使用第一个变量$\u SERVER['REQUEST\u URI']来提取index.php之后的所有内容:

RewriteRule ^(.*)$ index.php [QSA,L]
第二种方法在Drupal中使用,路由只是作为查询字符串传递

RewriteRule ^(.*)$ index.php?q=$1 [QSA,L]
现在,“Drupal方式”对我来说似乎简单多了。对于另一种方法,您必须在$\u服务器['REQUEST\u URI']和$\u服务器['SCRIPT\u NAME']上使用“explode”,然后使用类似于array\u diff\u assoc的方法删除脚本名和子目录名(如果有的话)。这不是很多工作,但是如果使用Drupal方法,您可以简单地提取$u GET['q']值,为什么没有人这样做呢?如果有的话,缺点是什么


谢谢。

使用
q
参数的缺点是,如果不重写URL,URL将看起来像

http://domain.com/?q=something
…与清洁剂(IMO)相反


重写url并没有任何巨大的优势或劣势。但是,我将指出所有内容,包括最后一个斜杠存储在
\u SERVER[PATH\u INFO]
中之后的内容,因此无需解析请求URI。

之所以使用较短的URL技术,主要是为了更干净的技术和更好的SEO。搜索引擎认为这两个URL是“相同的”:

我没有很好的解释,因此这里有一些链接,其中包含一些非常好的信息:


现在,有些人以不同的方式实现了较短的URL,但这就是我发现它们最适合我的方式:

In.htaccess

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
在index.php(或其他一些php文件)中


希望有帮助

是的,但是
PATH\u INFO
在所有服务器配置中都不可用。@Rob:要么是
REQUEST\u URI
。@alex:这太奇怪了。我在Apache、Nginx、Lighttpd和IIS中使用了
REQUEST\u URI
。我刚刚检查过,在我的便携式WAMP服务器中,
PATH\u INFO
不可用。还有一个使用
$\u GET
的原因,因为你不能总是依赖这些变量的可用性?我不知道你需要
explode()
,你可以在一行中使用
substr()
strpos()
:@Jared Farrish:但是如果脚本是在子目录中执行的,它的名字将保留在
REQUEST\u URI
上。这和我问的不完全一样,不过还是谢谢你!这是一个很好的解释,也许会帮助别人。
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
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] = "something";
$_GET[2] = "hello";
$_GET[3] = "blah";