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

通常,显示某个配置文件页面的实践或非常古老的方法是这样的:

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

其中 u=12345是用户 ID。

最近几年,我发现一些网站的网址非常漂亮,比如:

www.domain.com/profile/12345

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

大胆猜测一下,这和 .htaccess文件有关吗?你能给我更多的技巧或一些示例代码如何写的 .htaccess文件?

132737 次浏览

根据 这篇文章,您需要一个 mod _ rewrite (放置在 .htaccess文件中)规则,它看起来像这样:

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

这张地图要求

/news.php?news_id=63

/news/63.html

另一种可能性是使用 forcetype ,它强制沿着特定路径的任何内容使用 php 来计算内容。因此,在 .htaccess文件中,放入以下内容:

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

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

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

它实际上不是 PHP,而是使用 mod _ rewrite 的 apache。接下来发生的事情是,用户请求链接, www.example.com/profile/12345,然后 apache 使用重写规则将链接切碎,使其在服务器上看起来像这个 www.example.com/profile.php?u=12345。你可以在这里找到更多: 重写指南

看起来你正在谈论一个 RESTful Web 服务。

Http://en.wikipedia.org/wiki/representational_state_transfer

那个。Htaccess 文件确实重写了所有的 URI 以指向一个控制器,但是这一点比您想要得到的更详细。你可能想看看 休庭

这是一个完全用 PHP 编写的 REST 式框架

我最近在一个满足我需要的应用程序中使用了以下内容。

. 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.
}

ModRewrite 不是唯一的答案。中使用选项 + 多视图。然后检查 $_SERVER REQUEST_URI以查找 URL 中的所有内容。

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

我真正喜欢的一种方式是,如果使用 前置控制器模式,还可以使用像 http://yoursite.com/index.php/path/to/your/page/here这样的 url,并解析 $_ SERVER [‘ REQUEST _ URI’]的值。

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

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

在那里,你可以随心所欲地解析它,但是看在上帝的份上,一定要清理干净;)

我试着用下面的例子一步一步地解释这个问题。

0)问题

我试着这样问你:

我想像 Facebook ID www.facebook.com/kaila.piyush 一样翻开一页

它从 url 获取 id,并将其解析为 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

在根文件夹中创建一个. htaccess 文件或更新现有文件夹:

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

那有什么用?

如果请求是针对一个真实的目录或文件(服务器上存在的目录或文件) ,那么 index.php 不会被服务,否则每个 URL 都会被重定向到 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

它将创建这种类型的漂亮 URL:

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

更多访问漂亮的网址: http://www.webconfs.com/url-rewriting-tool.php