htaccess url rewrite / redirect - 就像facebook一样

时间:2012-06-23 08:00:40

标签: .htaccess

我有一个像www.example.com/mypage.php?id=324

这样的网址

该号码324是自动递增的(意味着该人是该网站的第324位用户),并且每个用户可以设置自己的用户URL,该用户URL存储在mysql表中(仅限字母数字)。

假设用户号码324具有用户url'peter'

我正在尝试将mypage.php?id=324替换为peter,因此该网址可以显示为www.example.com/peter

但我仍希望在内部维护mypage.php?id=324,因此如果有人输入www.example.com/mypage.php?id=324,则可以将其重定向到www.example.com/peter

我猜这是像facebook那样的虚荣网址?

我在网上搜索过,甚至买了一本关于htaccess的书,但我还是想不出来。请帮我!非常感谢你!

2 个答案:

答案 0 :(得分:7)

逐步重写网址...

第1步 - 确定您希望客户端网址的显示方式

您已完成此部分 - 您希望example.com/peter成为您的用户所看到的内容

第2步 - 计算服务器端URL

从技术上讲,您可以生成大量硬编码重写规则,例如

RewriteRule ^peter$ mypage.php?id=324
RewriteRule ^alice$ mypage.php?id=325
RewriteRule ^bob$ mypage.php?id=326

但是当你有很多用户时,这并不是特别有效。

你的mypage.php会接受一个id,但你真的需要修改它,以便它可以接受一个可能的用户名(但假设它将包含各种垃圾)。假设您决定允许它采用另一个查询字符串参数'hint'。所以现在你必须得到一个这样的网址:example.com/mypage.php?hint=peter

确保您的脚本为其不理解的任何用户名生成404响应。

步骤3 - 将客户端映射到服务器端URL的产品重写规则

执行此操作的一种方法是这样的 - 第一个RewriteCond行确保规则仅在请求与实际文件不匹配时触发。 RewriteRule将导致请求由mypage.php处理,但将其余的URL作为'提示'参数传递。 'qsa'部分是'query string append'的缩写,这意味着原始URL中存在的任何查询字符串都会添加到书面规则中。 'l'表示'last',因此不会调用其他规则来处理此请求。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-z]+)$ mypage.php?hint=$1 [qsa, l]

在mypage.php中,您将使用提示查找用户。

注意我在模式中一直非常严格,只允许小写字母序列。这有助于确保不会为您的网站可能生成的每个404调用脚本。

答案 1 :(得分:3)

But I still want to maintain mypage.php?id=324 internally, so if someone types 
www.example.com/mypage.php?id=324, redirected to www.example.com/peter

不建议使用您建议的网址,如果http://www.example.com/users/peter更好,那么您可以使用重写规则,例如..

RewriteRule ^/users/(.*)  /mypage.php?username=$1  [QSA,L]

在你的mypage.php中,你可以试试

<?php

if (isset($_GET["id"])) {
    // Get the $username from DB
    // Do the redirection to http://www.example.com/users/$username if found, 
    // else send 404     
} else if (isset($_GET["username"]) {
    // normal flow with $username
}