[英]How to do URL re-writing in PHP?
我正在尝试在我的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
通常,这只不过是启用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)
}
注意第一个正斜杠是如何调用函数的,后面的所有斜杠都填充了该函数的参数。 这真的非常好,让网络开发变得更加有趣!
您不能仅使用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 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]
对于第二个例子。
再次阅读评论和问题后,我意识到我以前的答案并不完全是您想要的东西。 因此,这里有一些补充,如果您想重写/重定向/代理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/');
?>
很抱歉没有给您详细的解释,但是也许您可以看看DokuWiki作为起点。
在其设置中,它接受3种模式:
它是免费的,因此您只需下载和浏览代码即可。
需要注意的是,apache重定向很可能是最好的解决方案,但是纯php也是很有意思的,以防您的代码要在IIS6服务器中运行,而重写在apache中不那么容易。
不幸的是,这实际上取决于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运行它。
您可以通过使用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中提取其余元素URL(/ videos / play / 203 / google-io-2009-wave-intro)为第一部分,加载具有该名称的php文件(videos.php或可以使用play.php)并传递参数203和google-io。
它实际上在做与mod_rewrite中的代码重写相同的操作,但是确实有一些好处:
您可以使用mod_rewrite从网址中删除index.php,请参见此处: http : //www.wil-linssen.com/expressionengine-removing-indexphp/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.