通常,显示某些个人资料页面的做法或非常古老的方法是这样的:
www.domain.com/profile.php?u=12345
u=12345
用户ID在哪里。
近年来,我发现一些网站的网址非常好,例如:
www.domain.com/profile/12345
如何在PHP中做到这一点?
就像一个疯狂的猜测一样,这与.htaccess
文件有关吗?您能给我更多关于如何编写.htaccess
文件的提示或一些示例代码吗?
Answers:
根据本文的介绍,您需要一个.htaccess
看起来像这样的mod_rewrite(放置在文件中)规则:
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'
?>
James Socol
和发布的链接Chad Birch
已断开。
我最近在满足我的需求的应用程序中使用了以下内容。
.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并将其解析为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);
}
做到这一点的简单方法。试试这个代码。将代码放入htaccess
文件中:
Options +FollowSymLinks
RewriteEngine on
RewriteRule profile/(.*)/ profile.php?u=$1
RewriteRule profile/(.*) profile.php?u=$1
它将创建此类型的漂亮URL:
有关htaccess的更多网址,请访问:http : //www.webconfs.com/url-rewriting-tool.php
有很多不同的方法可以做到这一点。一种方法是使用前面提到的RewriteRule技术来屏蔽查询字符串值。
我真正喜欢的方法之一是,如果您使用前端控制器模式,则还可以使用http://yoursite.com/index.php/path/to/your/page/here这样的网址并解析$ _SERVER的值['REQUEST_URI']。
您可以使用以下代码轻松提取/ path / to / your / page / here位:
$route = substr($_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME']));
从那里,您可以随意解析它,但是为了皮特的缘故,请确保对它进行消毒;)
看来您在谈论RESTful网络服务。
http://en.wikipedia.org/wiki/Representational_State_Transfer
.htaccess文件确实重写了所有URI,以指向一个控制器,但这要比这时要详细的多。您可能想看看凹进处
这是一个全部使用PHP的RESTful框架