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

时间:2009-05-01 18:23:01

标签: php url friendly-url

通常,显示某个个人资料页面的做法或非常古老的方式如下:

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

其中u=12345是用户ID。

近年来,我发现一些网站上有很好的网址,如:

www.domain.com/profile/12345

我如何在PHP中执行此操作?

就像猜测一样,是否与.htaccess文件有关?您能否给我提供更多关于如何编写.htaccess文件的提示或示例代码?

8 个答案:

答案 0 :(得分:43)

根据this article,您需要一个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'
?>

答案 1 :(得分:27)

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

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

答案 2 :(得分:13)

我尝试在以下示例中逐步解释此问题。

0)问题

我试着问你这样:

我想打开像facebook profile www.facebook.com/kaila.piyush

这样的页面

它从url获取id并将其解析为profile.php文件并从数据库返回featch数据并将用户显示给他的个人资料

通常当我们开发任何网站时它的链接看起来像 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);
}

答案 3 :(得分:8)

这样做的简单方法。试试这个代码。将代码放入htaccess文件中:

Options +FollowSymLinks

RewriteEngine on

RewriteRule profile/(.*)/ profile.php?u=$1

RewriteRule profile/(.*) profile.php?u=$1   

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

  

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

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

答案 4 :(得分:4)

它实际上不是PHP,它是使用mod_rewrite的apache。发生了什么事情是该人请求链接,www.example.com / profile12 / 342然后apache使用重写规则将其打包,使其看起来像这样,www.example.com/profile.php?u = 12345,服务器。您可以在此处找到更多信息:Rewrite Guide

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

我真正喜欢的方法之一是,如果您使用front controller模式,您还可以使用http://yoursite.com/index.php/path/to/your/page/here之类的网址并解析$ _SERVER ['REQUEST_URI']的值。

您可以使用以下代码轻松地将/ path /转至/ your / page / here位:

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

从那里,您可以随意解析它,但为了皮特的缘故,请确保您消毒它;)

答案 7 :(得分:-2)

看起来您正在谈论RESTful Web服务。

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

.htaccess文件会重写所有URI以指向一个控制器,但这比您想要获得的更详细。您可能需要查看Recess

它是PHP中的RESTful框架