我如何在PHP中进行URL重写?

时间:2009-02-06 22:20:09

标签: php html url-rewriting

这是一个双重问题:正确的答案将转到“如何在PHP中执行”,解释是否有任何优势,如果可能的话也会计算。

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

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

5 个答案:

答案 0 :(得分:6)

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

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

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

  1. “文件夹”类型的网址更易于人们输入和记忆。
  2. 页面“看起来像”到HTTP代理的页面。传统上,代理不会使用参数缓存页面,因为它们不代表单独的内容并且过于频繁地更改(想想搜索结果)。使用“文件夹式”URL可以正常缓存它们。
  3. 在PHP中,您可以通过$_GET['action']$_GET['postid']访问这些选项,就像浏览器要求重写的表单一样。

答案 1 :(得分:2)

要使用此类网址,您必须执行以下三个步骤:

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

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule !^index\.php$ index.php [L]
    

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

  2. 让您的脚本解析这些网址:

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

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

  3. 在输出中使用此网址。 (简单)

答案 2 :(得分:1)

用于搜索引擎优化目的,缓存和可读性的部分,正如其他人所指出的,我想补充一点,文件夹式参数也是用户用参数“玩”的动机。例如,在Stackoverflow上,当按标签过滤时,通常会手动编辑URL,而不是查找相应的按钮并单击它。

答案 3 :(得分:0)

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

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

当使用普通PHP而不重写时,如果您正确配置服务器,那么您也可以从脚本的文件名中删除.php,从而仍然可以获得“漂亮”的URL。

答案 4 :(得分:0)

有几个原因,但主要是:

  • SEO目的。搜索引擎通常会在“?”之后忽略任何内容问号标记,因此会留下非索引页面,甚至更糟糕的是,根本没有索引。

  • 可读性:

    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