带有编码斜杠的URL转到404

时间:2012-12-12 06:24:46

标签: .htaccess url encoding yii http-status-code-404

我使用用户提供的内容生成网址。

我的一个网址标题为Kikar Habusiness - émission du 2/12/12,转换为网址/url/Kikar+Habusiness+-+émission+du+2%2F12%2F12

它转到404.如果我从URL中删除%2F,它可以正常工作。

有趣的是,我的PHP代码(使用Yii)通常使用自定义页面处理404,但是这一个返回默认的Apache 404.这使我相信它甚至没有到达我的引导程序文件。

.htaccess读取:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

我的Yii parseUrl读取:

public function parseUrl($manager, $request, $pathInfo, $rawPathInfo) {
        if(preg_match('%^url/(\d+)%',$pathInfo,$matches)){
            $_GET['id'] = $matches[1];
            return 'url/view';
        }
        else if(preg_match('%^category/(\d+)%',$pathInfo,$matches)){
            $_GET['id'] = $matches[1];
            return 'category/view';
        }
        return false;
    }

我的URL slug生成器是:

public static function slug($title){
        $title = ToolBox::trim($title,60,false);
        $title = urlencode($title);
        return $title;
    }

请注意,我不能拥有基本的ASCII网址,因为有些内容是非拉丁语(例如希伯来语或阿拉伯语)。

2 个答案:

答案 0 :(得分:2)

这是Apache中的一个常见问题,幸好与Yii无关。

Apache将使用编码的URL部分%2F(/)和%5C(\)自动阻止它看到的任何URL。它甚至不会达到任何mod_proxy或mod_rewrite规则。

根据您的环境,有很多方法可以解决这个问题,而不会改变太多代码,包括:

  • “AllowEncodedSlashes”指令
  • 加倍urlencode()

请在此处查看完整列表和说明:http://www.jampmark.com/web-scripting/5-solutions-to-url-encoded-slashes-problem-in-apache.html

链接已关闭时的详细信息
如果你有权访问它,你可以启用AllowEncodedSlashes指令,它是一个非常古老的半安全修复程序,默认情况下它是关闭的。这将解决问题。如果您无法访问Apache配置,那么您将不得不查看其他解决方案。

答案 1 :(得分:0)

jampark网址重定向到错误的网页,请使用以下网址: http://www.leakon.com/archives/865