3

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

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

假设用户号 324 的用户 url 为“peter”

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

但是我还是想在mypage.php?id=324内部维护,所以如果有人www.example.com/mypage.php?id=324输入,可以重定向到www.example.com/peter

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

我已经在网上搜索过,甚至还买了一本关于 htaccess 的书,但我仍然无法弄清楚这一点。请帮我!非常感谢您!

4

2 回答 2

7

URL重写一步一步...

第 1 步 - 决定您希望客户端 URL 的外观

你已经完成了这部分 - 你想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,但您确实需要对其进行修改,以便它可以接受一个可能的用户名(但假设它将包含各种垃圾)。假设您决定允许它采用另一个查询字符串参数“提示”。所以现在你必须得到一个这样的 URL:example.com/mypage.php?hint=peter

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

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

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

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

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

请注意,我对模式的限制非常严格,只允许使用小写字母序列。这将有助于确保不会为您的站点可能产生的每个 404 调用您的脚本。

于 2012-06-23T08:08:30.793 回答
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
}
于 2012-06-23T08:27:29.197 回答