如何在PHP中创build友好的URL?

通常情况下,显示一些configuration文件页面的做法或非常古老的方式是这样的:

www.domain.com/profile.php?u=12345 

其中u=12345是用户标识。

近年来,我发现了一些非常漂亮的网站,例如:

 www.domain.com/profile/12345 

我如何在PHP中做到这一点?

就像一个疯狂的猜测,这是与.htaccess文件有关吗? 你可以给我更多的技巧或一些示例代码如何编写.htaccess文件?

根据这篇文章 ,你需要一个mod_rewrite(放置在一个.htaccess文件)规则,看起来像这样:

 RewriteEngine on RewriteRule ^/news/([0-9]+)\.html /news.php?news_id=$1 

这从地图请求

 /news.php?news_id=63 

 /news/63.html 

另一种可能是使用forcetype来强制forcetype ,这会迫使某个特定的path使用php来评估内容。 所以,在你的.htaccess文件中,input以下内容:

 <Files news> ForceType application/x-httpd-php </Files> 

然后index.php可以根据$_SERVER['PATH_INFO']variables采取行动:

 <?php echo $_SERVER['PATH_INFO']; // outputs '/63.html' ?> 

我最近在一个适合我的需求的应用程序中使用了以下内容。

的.htaccess

 <IfModule mod_rewrite.c> # enable rewrite engine RewriteEngine On # if requested url does not exist pass it as path info to index.php RewriteRule ^$ index.php?/ [QSA,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php?/$1 [QSA,L] </IfModule> 

的index.php

 foreach (explode ("/", $_SERVER['REQUEST_URI']) as $part) { // Figure out what you want to do with the URL parts. } 

我试图在下面的例子中逐步解释这个问题。

0)问题

我试着问你这样的:

我想打开页面像Facebook的个人资料www.facebook.com/kaila.piyush

它从url获得id,并将其parsing到profile.php文件,并从数据库和显示用户返回到他的个人资料

通常当我们开发任何网站的链接看起来像www.website.com/profile.php?id=username example.com/weblog/index.php?y=2000&m=11&d=23&id=5678

现在我们更新新风格不重写我们使用www.website.com/username或example.com/weblog/2000/11/23/5678作为永久链接

 http://example.com/profile/userid (get a profile by the ID) http://example.com/profile/username (get a profile by the username) http://example.com/myprofile (get the profile of the currently logged-in user) 

1).htaccess

在根文件夹中创build.htaccess文件或更新现有文件:

 Options +FollowSymLinks # Turn on the RewriteEngine RewriteEngine On # Rules RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php 

这是做什么的?

如果请求是针对真实的目录或文件(服务器上存在的),则index.php不会被提供,否则每个url都会被redirect到index.php。

2)index.php

现在,我们想知道要触发什么动作,所以我们需要阅读URL:

在index.php中:

 // index.php // This is necessary when index.php is not in the root folder, but in some subfolder... // We compare $requestURL and $scriptName to remove the inappropriate values $requestURI = explode('/', $_SERVER['REQUEST_URI']); $scriptName = explode('/',$_SERVER['SCRIPT_NAME']); for ($i= 0; $i < sizeof($scriptName); $i++) { if ($requestURI[$i] == $scriptName[$i]) { unset($requestURI[$i]); } } $command = array_values($requestURI); With the url http://example.com/profile/19837, $command would contain : $command = array( [0] => 'profile', [1] => 19837, [2] => , ) Now, we have to dispatch the URLs. We add this in the index.php : // index.php require_once("profile.php"); // We need this file switch($command[0]) { case 'profile' : // We run the profile function from the profile.php file. profile($command([1]); break; case 'myprofile' : // We run the myProfile function from the profile.php file. myProfile(); break; default: // Wrong page ! You could also redirect to your custom 404 page. echo "404 Error : wrong page."; break; } 

2)profile.php

现在在profile.php文件中,我们应该有这样的东西:

 // profile.php function profile($chars) { // We check if $chars is an Integer (ie. an ID) or a String (ie. a potential username) if (is_int($chars)) { $id = $chars; // Do the SQL to get the $user from his ID // ........ } else { $username = mysqli_real_escape_string($char); // Do the SQL to get the $user from his username // ........... } // Render your view with the $user variable // ......... } function myProfile() { // Get the currently logged-in user ID from the session : $id = .... // Run the above function : profile($id); } 

简单的方法来做到这一点。 试试这个代码。 把代码放到你的htaccess文件中:

 Options +FollowSymLinks RewriteEngine on RewriteRule profile/(.*)/ profile.php?u=$1 RewriteRule profile/(.*) profile.php?u=$1 

它会创build这个types的漂亮的URL:

http://www.domain.com/profile/12345/

更多的htaccess漂亮的URL: http : //www.webconfs.com/url-rewriting-tool.php

它实际上不是PHP,它是使用mod_rewrite的apache。 会发生什么事呢,这个人请求链接www.example.com/profile/12345,然后apache使用一个重写规则将其切断,使其看起来像这样www.example.com/profile.php?u=12345,服务器。 你可以在这里find更多: 重写指南

ModRewrite不是唯一的答案。 您也可以在.htaccess中使用Options + MultiViews,然后检查$_SERVER REQUEST_URI以查找URL中的所有内容。

有很多不同的方法来做到这一点。 一种方法是使用前面提到的RewriteRule技术来屏蔽查询string值。

我真正喜欢的方式之一就是如果你使用前端控制器模式,你也可以使用像http://yoursite.com/index.php/path/to/your/page/here这样的URL并parsing$ _SERVER的值[ 'REQUEST_URI']。

您可以使用以下代码轻松提取/ path / to / your / page / here位:

 $route = substr($_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME'])); 

从那里,你可以parsing它,但是为了皮特的缘故,确保你消毒;)

看起来你正在谈论一个REST风格的web服务。

http://en.wikipedia.org/wiki/Representational_State_Transfer

.htaccess文件确实将所有URI重写为指向一个控制器,但是这更详细,然后您想要在这一点上。 你可能想看看Recess

这是一个所有使用PHP的RESTful框架