【问题标题】:Pros/cons of using index.php?q=path/ instead of index.php/path/ when routing URLs?路由 URL 时使用 index.php?q=path/ 而不是 index.php/path/ 的优缺点?
【发布时间】:2011-10-04 01:24:37
【问题描述】:

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

我猜大多数框架都使用第一个,是使用 $_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'] 值,为什么没有人这样做呢?有什么缺点(如果有的话)?

谢谢。

【问题讨论】:

  • 我不知道你需要explode(),你可以在一行中使用substr()strpos()codepad.org/C3xBg4CI
  • @Jared Farrish:但如果脚本在子目录中执行,它的名称将保留在REQUEST_URI

标签: php url-rewriting url-routing


【解决方案1】:

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

http://domain.com/?q=something

...相对于清洁工 (IMO)...

http://domain.com/index.php/something

【讨论】:

    【解决方案2】:

    重写网址并没有太大的优势或劣势。但是,我会指出所有内容,包括最后的斜线存储在 _SERVER[PATH_INFO] 之后,因此不需要解析请求 URI。

    【讨论】:

    • 是的,但PATH_INFO 并非在所有服务器配置中都可用。
    • @Rob: 要么是REQUEST_URI
    • @alex:这很奇怪。我在 Apache、Nginx、Lighttpd 和 IIS 中使用过REQUEST_URI。我刚刚检查过,PATH_INFO 在我的便携式 WAMP 服务器中不可用。使用$_GET 的另一个理由,因为您不能总是依赖这些可用的变量?
    【解决方案3】:

    主要使用较短的 URL 技术的原因是为了更清洁的技术和更好的 SEO。搜索引擎认为这两个 URL 是“相同的”:

    http://www.domain.com/?b=something

    http://www.domain.com/?b=hello

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


    现在有些人以不同的方式实现较短的 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

    变成

    http://www.domain.com/something/hello/blah

    然后可以通过以下方式访问参数:

    $_GET[1] = "something";
    $_GET[2] = "hello";
    $_GET[3] = "blah";
    

    希望有帮助!

    【讨论】:

    • 不完全是我问的,但还是谢谢!这是一个很好的解释,也许会对其他人有所帮助。
    猜你喜欢
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多