路由URL时使用index.php?q=path/而不是index.php/path/的优缺点?
我正在编写一个简单的方法来将路径映射到文件,我遇到了两种方法 我猜大多数框架都使用第一个变量$\u SERVER['REQUEST\u URI']来提取index.php之后的所有内容:路由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
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";