在LAMP配置中创建虚荣URL

时间:2011-05-04 01:33:15

标签: php mysql apache mod-rewrite vanity-url

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

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

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

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

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

我知道.htaccess中的mod重写但不确定这会如何起作用。

正如我所提到的,我的网站是PHP,MySQL,Linux和Apache。

感谢。

4 个答案:

答案 0 :(得分:4)

重写site.com/user/USERNAME:

在根网站目录中,放置.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

答案 1 :(得分:4)

假设您的其他网页包含您可以检查的特定网址,以下内容应该有所帮助。

RewriteEngine on

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

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

/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

答案 2 :(得分: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路由,你会得到很多例子。

答案 3 :(得分:1)

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

有关如何使用PHP进行设置的快速摘要,请参阅Using a MySQL database to control mod_rewrite via PHP