我想进行重定向,用户在网址中输入用户名并重定向到他们的个人资料,例如:> example.com/user/joe
重定向example.com/user/profile.php?username=joe
并明显显示其个人资料。
我已经四处寻找如何做到这一点,但仍未设法让它发挥作用。 我怎么能这样做?我应该把我的.htaccess文件放在哪里?
答案 0 :(得分:3)
从您的目录看起来,'public'目录是您网站的文档根目录。所以,将.htaccess文件放在那里。
这些都没有经过测试。但这应该让你开始。我会用mod_rewrite来实现这个目的。这样的东西应该放到.htaccess文件中。
RewriteEngine On
RewriteRule ^user/(.+)$ user/profile.php?username=$1 [R,L]
这应该可以解决您的问题。 [R]
标志会导致Apache HTTPD要求浏览器重定向并访问新URL。如果您希望重定向是内部的,而不是用户对此有任何了解,请不要使用[R,L]
标志。
话虽如此,这就是我真正做到的。
RewriteEngine On
# Canonicalize /user/foo to /user/foo/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^profile/([^/]+)$ /profile/$1/ [R=301,L]
# Map /user/foo/ to foo's profile
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^profile/([^/]+)/$ profile/index.php?p=$1 [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
和RewriteCond %{REQUEST_FILENAME} !-d
将确保当用户请求服务器中存在的有效文件或文件夹的资源时,不要理会所有这些重定向规则,继续并立即提供该文件或文件夹。
第一个RewriteRule
是为了确保如果用户忘记了斜杠,服务器会要求浏览器重定向到带有斜杠的URL。这就是Apache HTTPD默认行为的方式(也许是因为mod_dir),我也会尝试在这里保留相同的行为。
第二个RewriteRule
确保对http://example.com/user/foo/
的请求是有效网址,但http://example.com/user/foo/bar/
不是。 [QSA]
标志可确保保留添加到URL的所有参数。
如果没有[QSA]
标记,http://example.com/user/foo/?ref=related+articles
会在内部重定向到http://example.com/user/profile.php?user=foo
。使用该标志,它将重定向到http://example.com/user/profile.php?user=foo&ref=related+articles
,这是我更喜欢的。