我有一个像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的书,但我还是想不出来。请帮我!非常感谢你!
答案 0 :(得分:7)
逐步重写网址...
您已完成此部分 - 您希望example.com/peter
成为您的用户所看到的内容
从技术上讲,您可以生成大量硬编码重写规则,例如
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响应。
执行此操作的一种方法是这样的 - 第一个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
}