虚荣URL重定向

时间:2013-12-03 23:17:15

标签: php regex apache .htaccess mod-rewrite

我有虚拟网址设置,可将http://localhost/username/重定向到http://localhost/profile.php?id=username

例如,http://localhost/testuser/http://localhost/testuser链接到http://localhost/profile.php?id=testuser,地址栏显示http://localhost/testuser/

但是,如果目录中存在同名文件夹,则此操作将停止。然后http://localhost/testuser/链接正确,但当我尝试访问http://localhost/testuser时,地址栏会显示http://localhost/testuser/?user=testuser

我的htaccess文件是:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^\.]+)/?$ $1.php [L]
RewriteRule ^([^\.]+)/?$ profile_redirect.php?user=$1 [L,QSA]

有没有办法防止这种情况发生?理想情况下,规则应检查SQL数据库中是否存在用户名(我已经有了此代码),如果有,则应重定向到http://localhost/profile.php?id=username,同时将地址栏保持为http://localhost/username/。即使存在该名称的文件夹,也会发生这种情况。

2 个答案:

答案 0 :(得分:1)

非常有趣的问题。我想出了这个解决方法:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^\.]+)/?$ $1.php [L]

# when user name != directory 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.]+)/?$ profile_redirect.php?user=$1 [L,QSA]

# when user name == directory 
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^([^.]+)/$ profile_redirect.php?user=$1 [L,QSA]

如果用户名与文件夹名称相同,那么只有第3个规则会被触发,并且在mod_dir添加了斜杠后也是如此。

答案 1 :(得分:0)

您可以尝试关闭目录斜杠。但要预先警告这会引发信息披露问题:

  

安全警告

     

关闭尾部斜杠重定向可能会导致信息泄露。考虑一下mod_autoindex处于活动状态(Options + Indexes)并且DirectoryIndex设置为有效资源(例如index.html)的情况,并且没有为该URL定义其他特殊处理程序。在这种情况下,带有斜杠的请求将显示index.html文件。但是没有尾随斜杠的请求将列出目录内容。

但如果您实际上没有访问任何目录,那么您可以:

DirectorySlash Off