我正在编写一个简单的方法来将路径映射到文件,我遇到过两种方法。
第一个,我猜大多数框架使用的是使用$ _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']值,为什么没有人这样做呢?有什么缺点,如果有的话?
感谢。
答案 0 :(得分:1)
使用q
param的缺点是,没有URL重写,URL看起来就像......
http://domain.com/?q=something
......而不是清洁工(IMO)...
http://domain.com/index.php/something
答案 1 :(得分:0)
在重写url的情况下,没有任何方式或其他方面存在巨大优势或劣势。但是,我会指出包括和在最终斜杠存储在_SERVER[PATH_INFO]
之后的所有内容,因此解析请求URI不是必需的。
答案 2 :(得分:0)
使用较短网址技术的原因主要在于更清晰的技术以及来自它的更好的搜索引擎优化。搜索引擎认为这两个网址“相同”:
我没有一个很好的解释,所以这里有一些关于它的一些非常好的信息的链接:
现在有些人用不同的方式实现较短的网址,但这就是我发现它们对我来说最好的方式:
在.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])以及所有后续数字。
网址如下所示:
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";
希望有所帮助!