3

在 LAMP 配置下创建用户虚 URL 的最佳方法是什么?

例如,可以按如下方式访问用户个人资料页面:

http://www.website.com/profile.php?id=1

现在,如果用户为他们的个人资料输入“虚 URL”,我希望虚 URL 加载上面的页面。

例如,如果用户选择“i.am.a.user”作为他们的虚 URL,并且他们在数据库中的用户 ID 为 1,那么http://www.website.com/profile.php?id=1将可以访问通过该 URL http://www.website.com/i.am.a.user

我知道 .htaccess 中的 mod 重写,但不确定这将如何在这里工作。

正如我提到的,我的网站使用 PHP、MySQL、Linux 和 Apache。

谢谢。

4

4 回答 4

4

为 site.com/user/USERNAME 重写:

在您的 Web 根目录中,放置一个 .htaccess 文件:

RewriteEngine on
RewriteRule ^user/(.+)$ profile.php?name=$1 [L]

这会将所有以“user”开头的请求路由到 profile.php 并将 URI 传递给$_GET['name']. 如果您有很多文件/目录/其他重写,则首选此方法。

为 site.com/USERNAME 重写:

RewriteEngine on
# if directory or file exists, ignore
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ profile.php?name=$1 [L]

仅当请求的文件或目录不存在并且请求 URI 不为空(即 www.site.com)时,才会路由到 profile.php

PHP 后端

现在在 profile.php 中,你可以有这样的东西:

if (!empty($_GET['name'])
    $user = ... // get user by username
else 
    $user = ... // get user by id
于 2011-05-04T01:48:54.300 回答
4

假设您的其他页面具有可以检查的特定 URL,以下内容应该会有所帮助。

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9-_]*)$ /profile.php?user=$1 [L]

这有助于维护当前 URL,同时允许用户使用快捷方式 URL。此外,RewriteRule只会匹配不包含 a 的 URL /,这将有助于防止非预期的重定向。所以,

/i-am-a-user -> MATCHES
/i_am_a_user -> MATCHES
/i-!am-a-user -> NOT MATCHED
/i.am.a.user  -> NOT MATCHED
/i.am.a.user/ -> NOT MATCHED
/some/page/ -> NOT MATCHED
/doesnotexist.php -> NOT MATCHED
/doesnotexist.html -> NOT MATCHED

希望有帮助。

编辑

我已经更新了上面的规则,因此不会重定向实际的文件/目录,并确保不会将任何.php.html文件发送到profile.php其中任何一个。

于 2011-05-04T02:34:17.427 回答
1

首先设置您的 .htaccess 文件以将所有对不存在的文件和目录的请求发送到单个 php 文件:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) router.php [NC,L]

然后在您的 router.php 中,查看 $_SERVER['REQUEST_URI'] 以获取用户名,然后您可以在查询中使用该用户名来获取有关用户的数据。

这假定所有不是用户个人资料页面的 URL 作为物理文件存在于您的服务器上。

如果不是这样,您可以在 router.php 中执行一些逻辑来决定对每个请求执行什么操作。用谷歌搜索 php 中的 url 路由,你会得到很多例子。

于 2011-05-04T05:56:10.887 回答
1

好吧,你当然也可以使用 apache RewriteMap来解决这个问题。RewriteMap 可以是纯文本文件(您可以根据用户输入的内容定期更新),或者您可以将其指向一个脚本(Perl、PHP 等任何适合您的)来为您进行重写。

有关如何使用 PHP 进行设置的快速总结,请参阅使用 MySQL 数据库通过 PHP 控制 mod_rewrite

于 2011-05-04T07:05:13.470 回答