2011-09-25 71 views
6

匹配%2F我有一组的重写规则(在.htaccess)是否是这样的:不能在mod_rewrite的

RewriteRule ^list/vendor/(.*)$ list.php?vendor=$1 
RewriteRule ^list/product/(.*)$ list.php?product=$1 
RewriteRule ^list/(.*)$ list.php?search=$1 

(我不认为前两个是有关我的问题,虽然) 。

当我myserver.com/list/foo%2Cbar甚至myserver.com/list/foo/bar型,我得到我预期的结果:list.php的被称为与$_GET['search']foo,barfoo/bar。如果我输入myserver.com/list/foo%2Fbar,看起来规则不匹配!我得到一个404错误,而不是。这里会发生什么? Apache 2.2.14,如果它很重要。

(我在Firefox和Chrome上试过,结果相同 - 当然它可能是浏览器的动作)。

+0

难道是Apache在这种情况下甚至没有在我的.htaccess文件中查找?这将是一个错误,我猜... – LHMathies

+0

错误日志包含(在信息级别):在URI中找到%2f(编码的'/')...返回404' – cweiske

回答

14

Bah,我发现它... Apache选项AllowEncodedSlashes,它不能在每个目录或.htaccess中设置,默认情况下它是关闭的。

构建一个解决方法的时间,如果我不能让托管人在我的虚拟服务器上打开它。

+0

当你不想要或不可能改变服务器配置可以在创建URL之前用'-'替换所有的'/'字符。这不会被编码为'%xx'字符。当你需要原始字符串时,只需再次用'/'替换'-'。 – LEDfan

+0

我刚刚遇到了同样的问题,尝试将URL作为参数传递给mod_rewrite URL。我的解决方案是将urlencode加上我想要传递的URL,然后在接收端解码它。我在JavaScript端使用JavaScript和PHP,所以我使用'encodeURIComponent(encodeURIComponent(urlToBePassed))',这样实际获得的参数是'http://example.com/url/http%253A%252F% 252Ftheurl.being.passed.com%252FsomeDir%252FsomeImage.png'。有点复杂,但似乎工作。 –