如何在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框架(模型,视图,控制器)。 它基本上允许你像一组功能一样对待你的网站:
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种模式:
- 常规网址:?id = zzz
- .htaccess重写:使用apache来重写
- 内部(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的代码,但有几个好处:
- 如果你是新手,不需要太多的mod_rewrite代码。
- 允许你把所有的安全代码放在一个地方 – 在index.php中
- 很容易改变网址和处理404s等
你可以使用mod_rewrite从URL中删除index.php,见这里: http : //www.wil-linssen.com/expressionengine-removing-indexphp/