我有虚拟网址设置,可将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/
。即使存在该名称的文件夹,也会发生这种情况。
答案 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