【问题标题】:How to do URL re-writing in PHP?如何在 PHP 中进行 URL 重写?
【发布时间】:2010-11-05 14:23:25
【问题描述】:

我正在尝试在我的 PHP 应用程序中实现 URL 重写。有人可以分享在PHP和MySQL中实现URL重写的分步过程吗?

在我的应用程序中,我想实现以下 URL 重写,我想重定向

1. http://example.com/videos/play/google-io-2009-wave-intro
2. http://example.com/videos/play/203/google-io-2009-wave-intro

1. http://example.com/videos/play.php?title=google-io-2009-wave-intro
2. http://example.com/videos/play.php?id=203

请告诉我如何以上述任何方式实现 URL 重写。

从以下两种类型中,根据SEO、管理、应用程序的观点,哪个URL最好。

1. http://example.com/videos/play/google-io-2009-wave-intro
2. http://example.com/videos/play/203/google-io-2009-wave-intro

【问题讨论】:

  • 我想这是以前问过的。看看here我的完整解决方案。
  • Here 是来自 Nettuts 关于 mod_rewrite 的一个很好的教程。

标签: php apache mod-rewrite seo url-rewriting


【解决方案1】:

A Beginner's Guide to mod_rewrite.

通常这只不过是启用 mod_rewrite 模块(您可能已经在您的主机上启用了它),然后将 .htaccess 文件添加到您的 web 目录中。一旦你这样做了,你离完成只有几行。上面链接的教程会照顾你。

只是为了好玩,这里有一个Kohana .htaccess 文件用于重写:

# Turn on URL rewriting
RewriteEngine On

# Installation directory
RewriteBase /rootDir/

# Protect application and system files from being viewed
RewriteRule ^(application|modules|system) - [F,L]

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/
RewriteRule .* index.php/$0 [PT,L]

这将接受所有请求并通过 index.php 文件引导它们。因此,如果您访问 www.examplesite.com/subjects/php,您实际上可能正在访问 www.examplesite.com/index.php?a=subjects&b=php。

如果您发现这些 URL 很有吸引力,我会鼓励您更进一步并查看 MVC 框架(模型、视图、控制器)。它本质上允许您将您的网站视为一组功能:

www.mysite.com/jokes

public function jokes ($page = 1) {
  # Show Joke Page (Defaults to page 1)
}

或者,www.mysite.com/jokes/2

public function jokes ($page = 1) {
  # Show Page 2 of Jokes (Page 2 because of our different URL)
}

注意第一个正斜杠是如何调用函数的,后面的所有内容都会填充该函数的参数。真的很不错,让网络开发更有趣!

【讨论】:

    【解决方案2】:

    您可以通过使用前端控制器来实现与上述建议稍有不同的方法,它是制作自定义 URL 的常用解决方案,并且可用于所有语言,而不仅仅是 PHP。这是一个指南:http://www.oreillynet.com/pub/a/php/2004/07/08/front_controller.html

    基本上你会创建一个 index.php 文件,它会为每个 URL 调用,它的工作是解析 URL 并根据 URL 的内容确定要运行的代码。因此,例如,用户将使用诸如http://example.com/index.php/videos/play/203/google-io-2009-wave-intro 之类的 URL,index.php 将从 URL (/videos/play/203/google-io-2009-wave-intro) 中提取剩余的元素作为第一部分,加载一个具有该名称的 php 文件(videos.php 或者您可以使用 play.php)并传递参数 203 和 google-io。

    它与在 mod_rewrite 中重写代码的效果相同,但确实有一些好处:

    1. 如果您是新手,不需要太多 mod_rewrite 代码。
    2. 允许您将所有安全代码放在一个位置 - 在 index.php 中
    3. 更改 URL 和处理 404 等很容易。

    您可以使用 mod_rewrite 从 URL 中删除 index.php,请参见此处:http://www.wil-linssen.com/expressionengine-removing-indexphp/

    【讨论】:

      【解决方案3】:

      在再次阅读 cmets 和 question 之后,我意识到我之前的答案并不完全是您正在寻找的东西。所以这里有一些补充,如果你想重写/重定向/代理 URL 地址,例如然后用户键入 www.f1.com,他实际上会看到 www.f2.com,但域将保持不变,你可能需要设置一个reverse proxy 为此使用 Apache。它的作用类似于 mod_rewrite。

      关于第二部分,由于现代爬虫也执行 URL 链接分析,我认为您的第一个选项在性能方面更好。

      上一个答案:
      并且使用 PHP 你可以实现重定向:

      <?php
      // Here you can parse the current location
      // and decide whenever you want to go
      // if $_SERVER[ 'PHP_SELF'] some conditions then....
      header('Location: http://www.example.com/');
      ?>
      

      来自php.netHere 更多示例。

      【讨论】:

      • 根据您的问题,很有可能我不是。所以也许值得澄清一下。您问如何使用 PHP 进行重定向,我向您展示了一个示例,它只是硬编码的,但是您可以在编写标头之前进行解析,然后再做出决定。
      • 好吧,你可能是因为重定向而误解了,无论如何,我正在寻找 URL 重写,这意味着如果用户在浏览器中输入 URL,例如example.com/video/play/203/kjhjkhkjh,那么在内部它应该调用 play.php 来获取回复。这称为重写。
      • -1 代表……嗯?那只是为了重定向。问题是关于如何拥有漂亮的网址。
      • @Gabriel,问题不仅仅在于这个。
      【解决方案4】:

      请记住,重定向与重写不同。

      重定向是指服务器收到请求并将响应作为重定向发送。例如,您请求一个页面 www.example.com/page。当服务器收到此消息时,页面或服务器自己会向浏览器发出重定向命令。重定向命令基本上说“去这里:新页面”。在 PHP 中,这是 header('Location: newpage.html'); 的形式。

      重写是服务器从浏览器接收到请求,然后在该站点的匹配正则表达式列表中查找。如果找到匹配项,则将 URL 重写为该表单并相应地进行响应。例如,请求的 URL www.example.com/specificpage 可以(在服务器端)重写为 www.example.com/?loadpage=specificpage。浏览器永远不会收到表明它必须转到其他地方的标头信息。

      【讨论】:

        【解决方案5】:

        使用模组重写:

        RewriteRule ^videos/play/([0-9]+)/([^.]+)$ play.php?id=$1&name=$2
        

        example.com/play.php?id=203&name=google-io-2009-wave-intro

        可以作为

        example.com/videos/play/203/google-io-2009-wave-intro

        【讨论】:

          【解决方案6】:

          如果您的服务器支持 (apache / mod_rewrite),您可以使用 .htaccess 文件重新引导访问者。

          类似的东西(只是一个草稿,适应你自己的需要......):

          RewriteEngine On
          RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)/([0-9]+)/([-0-9a-zA-Z]+)/?$ /$1/$2.php?id=$3 [L]
          

          第二个例子。

          【讨论】:

            【解决方案7】:

            不幸的是,这完全取决于 Web 服务器,而不是 PHP。根据您是否使用 Apache 或其他方式,它必须在执行脚本之前执行此操作。我使用 mod_rewrite,示例重写规则如下所示:

            <Directory "/home/www/html">
                RewriteEngine On
                RewriteBase /
                    RewriteCond %{REQUEST_FILENAME} !-f
                    RewriteCond %{REQUEST_FILENAME} !-d
                    RewriteRule ^(.*)$ /index.php/%{REQUEST_URI} [PT,L]
            </Directory>
            

            上面的规则基本上说如果 URL 是真实文件或目录的有效路径,则加载它。否则,通过 index.php 运行它。

            【讨论】:

              【解决方案8】:

              很抱歉没有给你详细的解释,但也许你可以看看DokuWiki作为起点。

              在其设置中,它接受 3 种模式:

              1. 常规网址:?id=zzz
              2. .htaccess rewrite:使用apache进行重写
              3. 内部 (php) 重写:url 最终看起来像 http://www.example.com/kb/doku.php/start

              它是免费的,因此您可以下载并浏览代码。

              请注意,apache 重定向很可能是最好的解决方案,但如果您的代码将在 IIS6 服务器中运行,而重写不像在 apache 中那么容易,那么纯 php 也很有趣。

              【讨论】:

                【解决方案9】:

                您不能单独使用 PHP 来做到这一点。您需要查看 mod_rewrite(假设您使用的是 apache)。

                【讨论】:

                • @jeroen 您不能仅使用 php 执行此操作,因为驱动 url 的是 apache,而 apache 将尝试获取请求的资源,这就是 mod_rewrite 允许您重写 url 的原因。那就是说你需要除了 php 之外的其他层来制作这个
                • 只是意识到......你可以像 index.php/mi-page, index.php/my-page-2 那样做,但你仍然在 url 中有 index.php,这里的目标是删除它
                • 虽然...一个非常非常非常糟糕但可能的纯 php 解决方案是在您的 404 错误页面中完成重写。对 SEO 非常不友好,但只是假设性的 :-)
                • 你会感到惊讶。至少由一个备受瞩目的软件包完成。
                猜你喜欢
                • 2010-10-06
                • 2014-06-08
                • 1970-01-01
                • 1970-01-01
                • 2012-06-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-12-14
                相关资源
                最近更新 更多