如何在PHP中重写URL?

时间:2009-06-24 17:17:21

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

我正在尝试在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

9 个答案:

答案 0 :(得分:23)

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。

如果您发现这些网址很有吸引力,我建议您更进一步,查看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)
}

注意第一个正斜杠如何调用一个函数,所有后面的函数都填充了该函数的参数。这真的非常好,让网络开发更有趣!

答案 1 :(得分:7)

单独使用PHP无法做到这一点。您需要查看mod_rewrite(假设您正在使用apache)。

答案 2 :(得分:6)

使用mod重写:

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

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:2)

如果您的服务器支持它(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]

第二个例子。

答案 5 :(得分:1)

在再次阅读评论和提问之后,我意识到我之前的回答并不完全是你想要的。所以这里有一些补充,如果你想重写/重定向/代理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更多例子。

答案 6 :(得分:1)

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

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

  1. 常规网址:?id = zzz
  2. .htaccess rewrite:使用apache进行重写
  3. internal(php)rewrite:urls最终看起来像http://www.example.com/kb/doku.php/start
  4. 它是免费的,所以你可以下载并浏览代码。

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

答案 7 :(得分:1)

不幸的是,它真的取决于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 :(得分:1)

通过使用Front Controller,您可以略微区别于上述建议,它是制作自定义URL的常用解决方案,并且用于所有语言,而不仅仅是PHP。以下是指南:http://www.oreillynet.com/pub/a/php/2004/07/08/front_controller.html

基本上,您将创建一个为每个URL调用的index.php文件,其作用是解析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. 很容易更改网址和处理404等。
  4. 您可以使用mod_rewrite从URL中删除index.php,请参阅此处:http://www.wil-linssen.com/expressionengine-removing-indexphp/