在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。
感谢。
答案 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。