1

这是一个双重问题:正确答案将转到“您如何在 PHP 中做到这一点”,解释是否有任何优势,如果可能的话也很重要。

我只是好奇,因为我真的不知道,我在网页上看到了很多。

编辑:我不知道技术名称,但例如在 Stackoverflow 上:“ http://stackoverflow.com/posts/edit/522452”是我所说的“文件夹”(以前在问题标题中使用的术语)。

4

5 回答 5

6

如果您指的是/posts/edit/522452-style URLs 而不是/posts.asp?action=edit&postid=522452-style URLs(或它在后端转换为的任何内容),这通常是通过 URL 重写器完成的,例如mod_rewrite. 该 URL 的规则可能如下所示:

RewriteRule ^/posts/(\w+)/(\d+) /posts.asp?action=\1&postid=\2

这种 URL 的两个主要优点是:

  1. “文件夹”类型的 URL 更易于人们键入和记住。
  2. 该页面“看起来像”HTTP 代理的页面。传统上,代理不会缓存带有参数的页面,因为它们不代表单独的内容并且更改过于频繁(想想搜索结果)。使用“文件夹样式”的 URL 可以正常缓存它们。

在 PHP 中,您可以通过$_GET['action']和访问这些选项$_GET['postid'],就像浏览器要求重写表单一样。

于 2009-02-06T22:33:05.837 回答
2

要使用此类 URL,您必须执行三个步骤:

  1. 告诉您网络服务器,这些请求应该重定向到您的 PHP 脚本。使用 Apache,您可以使用mod_rewrite 模块来执行此操作:

    重写引擎开启
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule !^index\.php$ index.php [L]
    

    该指令将每个与文件系统中的文件不匹配的请求重定向到index.php.

  2. 获取您的脚本来解析这些 URL:

    $_SERVER['REQUEST_URI_PATH'] = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']);
    $segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));
    var_dump($segments);
    

    这可能是解析 URL 路径并获取每个路径段的最简单方法。

  3. 在您的输出中使用此 URL。(琐碎的)

于 2009-02-06T22:47:37.930 回答
1

正如其他人指出的那样,出于 SEO 目的、缓存和可读性的一部分,我想补充一点,文件夹样式的参数也是用户“玩弄”参数的动力。例如,在 Stackoverflow 上,当按标签过滤时,通常很想手动编辑 url,而不是寻找合适的按钮并单击它。

于 2009-02-06T22:38:12.503 回答
0

优点是可读性和可能在搜索引擎中更好的位置。

mod_rewrite如果您使用的是 Apache,您可以通过以下方式实现此目的。在 PHP 中,您还可以查看预定义的全局变量 - 我认为$_SERVER['REQUEST_URI']可行,但可能会有更好的全局变量。

在不重写的情况下使用纯 PHP 时,.php如果您适当地配置您的服务器,您也可以从脚本的文件名中删除 ,因此仍然可以获得“不错的”URL。

于 2009-02-06T22:28:16.250 回答
0

有几个原因,但主要是:

  • 搜索引擎优化的目的。搜索引擎通常会忽略“?”之后的任何内容。问号符号,从而使您无法索引页面,或者更糟糕的是,根本没有索引。

  • 可读性:

    www.somesite.com/products/devices/keyboards/20,asc
    www.somesite.com/products/devices/keyboards/20,asc.html
    

    看起来比:

    www.somesite.com?show=products&cat=devices&sub_cat=keyboards&sort=asc&items=20
    
  • 缓存。

有关如何在 Apache 中执行此操作的信息: http ://httpd.apache.org/docs/2.0/misc/rewriteguide.html

于 2009-02-06T22:32:28.317 回答