繁体   English   中英

如何在PHP中重写URL?

[英]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入门指南

通常,这只不过是启用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/');
?>

来自php.net 这里有更多例子。

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

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

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

它是免费的,因此您只需下载和浏览代码即可。

需要注意的是,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中的代码重写相同的操作,但是确实有一些好处:

  1. 如果您是新手,则不需要太多的mod_rewrite代码。
  2. 允许您将所有安全代码放在一个位置-在index.php中
  3. 更改URL和处理404等很容易。

您可以使用mod_rewrite从网址中删除index.php,请参见此处: http : //www.wil-linssen.com/expressionengine-removing-indexphp/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM