如何在 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 重写?的主要内容,如果未能解决你的问题,请参考以下文章