我使用用户提供的内容生成网址。
我的一个网址标题为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网址,因为有些内容是非拉丁语(例如希伯来语或阿拉伯语)。
答案 0 :(得分:2)
这是Apache中的一个常见问题,幸好与Yii无关。
Apache将使用编码的URL部分%2F(/)和%5C(\)自动阻止它看到的任何URL。它甚至不会达到任何mod_proxy或mod_rewrite规则。
根据您的环境,有很多方法可以解决这个问题,而不会改变太多代码,包括:
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