Codeigniter问题 - 删除尾部斜杠,将其他非允许的URI字符重定向到404页面

时间:2012-10-19 23:27:31

标签: .htaccess codeigniter redirect http-status-code-404

我最近在.htaccess中添加了以下内容以删除尾部斜杠:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ $1 [L,R=301]

我还扩展CI_URI以删除不允许的URI字符并重定向到404页面(感谢原作者,而不是我!):

public function _filter_uri($str)
{
if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
{
// preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to   preg_quote() is to maintain backwards
// compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern
if ( ! preg_match('|^['.str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-')).']+$|i', $str))
{
show_404(); //show 404 error page instead "The URI you submitted has disallowed characters" error
}
}

// Convert programatic characters to entities and return
return str_replace(
array('$',     '(',     ')',     '%28',   '%29'),
// Bad
array('$', '(', ')', '(', ')'),
// Good
$str);
}
}

由于我添加了.htaccess代码,因此URI中包含任何不允许的字符,例如http://www.mysite.com/contro,ller/func,tion(使用逗号)会导致重定向到301页面,后续链接指向404错误页面(即“页面已移至此处”,并带有指向我标准404页面的链接)。

我可以让两者一起工作,所以不允许的字符只是重定向到我的标准404页面吗?

1 个答案:

答案 0 :(得分:0)

如果查看item('permitted_uri_chars')列表,您可以将它们复制到重写规则中。假设允许的字符是斜杠,数字/字母,下划线,句点和连字符:

RewriteRule !^[A-Za-z0-9_/\-\.]*$ - [L,R=404]

另请注意,URL转义字符在通过mod_rewrite发送之前会被解码。因此,如果网址与http://something.com/foo%20bar类似,那么您用来匹配它的表达式为:^foo\ bar$,因为%20未转义为空格。