这是我的.htaccess文件:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* ?p=$0
仅当mysite.com/?p=request
不是文件时才应重定向到request
。但是,由于http://mysite.com/auth.php?openid.ns=http%3A%2F
(auth.php确实存在),它与%2F
之类的请求不正确匹配。我不明白为什么那会搞砸......想法?
编辑:伙计们,我强调%2F
(这是一个正斜杠btw),因为在这个角色不存在时工作正常
要清楚,
我为此页面获得了404:http://mysite.com/auth.php?openid.ns=http%3A%2F
但不是此页:http://mysite.com/auth.php?openid.ns=http%3A
仅供参考,我真的搞砸了这个问题。任何时候%2F出现在URL中都是403错误。我的应用程序正在捕获此错误并吐出一个欺骗性的404,这对最终用户可能不那么可怕。毕竟,真的与.htaccess无关。我在下面的回答中提供了更多细节。
答案 0 :(得分:3)
是否可以启用AllowEncodedSlashes
,默认情况下是关闭的?当关闭此指令时,包含编码的正斜杠和反斜杠字符(即%2F和%5C)的请求将被404拒绝。
我依稀记得在MediaWiki中看到这个问题,在逃避游戏等时必须做各种有趣的事情,以避免在不同级别的请求处理中出现各种各样的蠢事。事实证明,Apache中的很多东西都喜欢乱用PATH_INFO等等,这对我们其他人来说没有任何结局。
答案 1 :(得分:0)
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f
测试变量的值,使用类似:
RewriteRule (.*) http://www.google.com/?test=%{REQUEST_FILENAME} [L]
如果它没有auth.php文件的完整文件路径,则无法找到它。我在这里得到了这个信息:
http://mail-archives.apache.org/mod_mbox/httpd-bugs/200812.mbox/
答案 2 :(得分:0)
这可能与你的正则表达式中没有括号的事实有关,因此捕获不会发生。以下适用于我:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ ?p=$1 [L,QSA]
答案 3 :(得分:0)
不是AllowEncodedSlashes
问题。它命中了一个mod_security
规则,禁止http://
在params中阻止文件注入。他们把它列入白名单。
答案 4 :(得分:0)
非apache相关的答案是不会在参数中传递已知的“http://”字符串。将我的stackoverflow帐户页面视为一个openID示例,它甚至根本不存储“http://”,只是“me.yahoo.com/a/swxth ....”。
也许这才是真正的答案。如果您的应用程序希望在内部使用“http”URL执行某些操作,则应该知道在最后一个负责任的时刻将其添加到开头。