如何在PHP中重写URL?

我正试图在我的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重写。

从以下两种类型中,根据搜索引擎优化,管理,应用程序的观点,哪一个URL最好。

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

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框架(模型,视图,控制器)。 它基本上允许你像一组功能一样对待你的网站:

http://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) } 

注意第一个正斜杠是如何调用一个函数的,接下来的所有函数都会填充该函数的参数。 这真的很好,让网络开发更有趣!

你不能单独使用PHP。 你需要看看mod_rewrite(假设你使用的是Apache)。

使用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

请记住,重定向与重写不一样。

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

重写是服务器收到来自浏览器的请求,然后查找该网站的匹配正则表达式列表。 如果找到一个匹配项,URL将被重写到该表单中并作出相应的响应。 例如,请求的URL http://www.example.com/specificpage可以在www.example.com/?loadpage=specificpage中重写(在服务器端)。; 浏览器永远不会收到标题信息,说明它必须去其他地方。

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

对于第二个例子。

对不起,没有给你详细的解释,但也许你可以看看DokuWiki的起点。

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

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

它是免费的,所以你可以下载和浏览代码。

需要注意的是,apache重定向很可能是最好的解决方案,但是纯php的重定向也很有趣,以防你的代码在IIS6服务器上运行,而重写不像apache那样容易。

不幸的是,这真的取决于网络服务器,而不是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运行它。

在阅读了评论和问题之后,我意识到我以前的答案并不完全是你正在寻找的东西。 所以这里有一些补充,如果你想重写/重定向/代理的URL地址,例如,然后用户类型www.f1.com,他将实际上看到www.f2.com,但域将保持不变,您可能需要设置一个反向代理使用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 。 这里更多的例子。

通过使用前端控制器,您可以与上述建议略有不同,这是制作自定义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. 很容易改变网址和处理404s等

你可以使用mod_rewrite从URL中删除index.php,见这里: http : //www.wil-linssen.com/expressionengine-removing-indexphp/