.htaccess与GET params发生冲突

时间:2009-05-06 18:47:14

标签: .htaccess

这是我的.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无关。我在下面的回答中提供了更多细节。

5 个答案:

答案 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执行某些操作,则应该知道在最后一个负责任的时刻将其添加到开头。