如何在 PHP 中进行 URL 重写?

Posted

技术标签:

【中文标题】如何在 PHP 中进行 URL 重写?【英文标题】:How to do URL re-writing in PHP? 【发布时间】: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 的一个很好的教程。 【参考方案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 中重写代码的效果相同,但确实有一些好处:

    如果您是新手,不需要太多 mod_rewrite 代码。 允许您将所有安全代码放在一个位置 - 在 index.php 中 更改 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.net。 Here 更多示例。

【讨论】:

根据您的问题,很有可能我不是。所以也许值得澄清一下。您问如何使用 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 种模式:

    常规网址:?id=zzz .htaccess rewrite:使用apache进行重写 内部 (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 非常不友好,但只是假设性的 :-) 你会感到惊讶。至少由一个备受瞩目的软件包完成。

以上是关于如何在 PHP 中进行 URL 重写?的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时在php中重写URL

使用 htaccess 重写后,如何在 PHP 中获取可见 URL(不是实际 URL)? [复制]

如何在php中重写Get变量的url [重复]

如何在apache中重写url

web前端如何重写URL地址

如何进行简单的url重写[重复]