如何在Codeigniter路由中使用UTF-8编码的阿拉伯字符,出现404错误

3

我正在尝试在Codeigniter中使用阿拉伯语/波斯语/Farsi字符作为slug的URL,如下所示:

我创建了MY_url_helper.php助手文件,将阿拉伯语字符添加为url_title Codeigniter函数中可接受的字符。

/**
 * Create URL Title that allows Arabic characters
 *
 * Takes a "title" string as input and creates a
 * human-friendly URL string with a "separator" string 
 * as the word separator.
 *
 * @access  public
 * @param   string  the string
 * @param   string  the separator
 * @return  string
 */
function url_title($str, $separator = '-', $lowercase = FALSE) {
    if ($separator == 'dash') {
        $separator = '-';
    } else if ($separator == 'underscore') {
        $separator = '_';
    }
    $q_separator = preg_quote($separator);
    $trans = array(
        '&.+?;' => '',
        '[^[U+0621]-[U+064a]a-z0-9 _-]' => '',
        '\s+' => $separator,
        '(' . $q_separator . ')+' => $separator
    );
    $str = strip_tags($str);
    foreach ($trans as $key => $val) {
        $str = preg_replace("#" . $key . "#i", $val, $str);
    }
    if ($lowercase === TRUE) {
        $str = strtolower($str);
    }
    return trim($str, $separator);
}

然后我需要在config.php文件中启用阿拉伯字符作为允许的uri字符:

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';  
$config['permitted_uri_chars']  .= 'لإ-لآ-أ-لآ-ض-ص-ث-ق-ف-غ-ع-ه-خ-ح-ج-د-ط-ك-م-ن-ت-ا-ل-ب-ي-س-ش-ئ-ء-ؤ-ر-ل-ا-ى-ة-و-ز-ظ-إ';

我这样测试了它

http://dev/ar/pages/index/مهمتنا

现在一切都正常,缺少的是路由。

就像这个英文句子一样:

$route['^(en|ar)/mission'] = "pages/index/mission";

我希望这可以在阿拉伯语中工作:

$route['^(en|ar)/مهمتنا'] = "pages/index/مهمتنا";

这会返回404

我尝试将permitted_uri_chars清空,如下所示:

$config['permitted_uri_chars'] = '';

我仍然遇到了完全相同的问题;没有路由的链接可以正常工作,而有路由的链接会给我返回404错误。

4个回答

4
解决方案就是这么简单:
routes.php 配置文件中进行以下操作:
$mission = urlencode('مهمتنا');
$route['^(en|ar)/'.$mission] = "pages/index/".$mission;

不需要更改 config.php 配置文件中的 permitted_uri_chars

如果错误与 permitted_uri_chars 有关,则输出将为 400 "您提交的 URI 包含不允许的字符。",而不是 404,如您在此处 system/core/URI.php 的第 231 行所见:

if (!preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str))
{
    show_error('The URI you submitted has disallowed characters.', 400);
}

请您看一下这个链接:https://stackoverflow.com/questions/56229130/codeigniter-all-arabic-routes-are-not-working - PHP User
不需要更改或配置每一行,您可以将以下行添加到.htaccess文件中,如下所示:RewriteRule ^([\s\S]*)$ index.php?rt=$1 [L,B,QSA] - Jodyshop
你好,我想请问如果阿拉伯语的值是动态的,该如何编写路由呢?$route['^(en|ar)/getdetails/(:any)'] = "controller/getdetails/$1";http://localhost/project/ar/getdetails/arabic_value 是从浏览器调用的URL! - mevr
1
如果您按照问题描述创建了MY_url_helper,那么它应该可以正常工作。 - Waqleh

2

我尝试过这个方法,它对我有效。只需在.htaccess文件中添加以下内容即可:

RewriteRule ^([\s\S]*)$ index.php?rt=$1 [L,B,QSA]

哇!这个技巧真是太棒了,感谢你的救命之恩 :) - Jodyshop
我尝试过这个技巧,但对我没有起作用,我能知道失败的可能性吗?谢谢! - mevr

0
尝试对阿拉伯字符进行编码,这样就不用使用:
$config['permitted_uri_chars']  .= 'لإ-لآ-أ-لآ-ض-ص-ث-ق-ف-غ-ع-ه-خ-ح-ج-د-ط-ك-م-ن-ت-ا-ل-ب-ي-س-ش-ئ-ء-ؤ-ر-ل-ا-ى-ة-و-ز-ظ-إ';

你可能想要使用:

$config['permitted_uri_chars'] .= '%D9%84%D8%A5-%D9%84%D8%A2-%D8%A3-%D9%84%D8%A2-%D8%B6-%D8%B5-%D8%AB-%D9%82-%D9%81-%D8%BA-%D8%B9-%D9%87-%D8%AE-%D8%AD-%D8%AC-%D8%AF-%D8%B7-%D9%83-%D9%85-%D9%86-%D8%AA-%D8%A7-%D9%84-%D8%A8-%D9%8A-%D8%B3-%D8%B4-%D8%A6-%D8%A1-%D8%A4-%D8%B1-%D9%84-%D8%A7-%D9%89-%D8%A9-%D9%88-%D8%B2-%D8%B8-%D8%A5';

您可能还想从配置项中删除“-”字符,以便“permitted_uri_chars”配置项如下:
$config['permitted_uri_chars'] .= '%D8%A2%D8%A7%D8%A8%D9%BE%D8%AA%D8%AB%D8%AC%DA%86%D8%AD%D8%AE%D8%AF%D8%B0%D8%B1%D8%B2%D8%B3%D8%B4%D8%B5%D8%B6%D8%B7%D8%B8%D8%B9%D8%BA%D9%81%D9%82%DA%A9%DA%AF%D9%84%D9%85%D9%86%D9%88%D9%87%DB%8C%D9%8A%DB%B1%DB%B2%DB%B3%DB%B4%DB%B5%DB%B6%DB%B7%DB%B8%DB%B9%DB%B0';

这应该解决您的问题,因为这些字符是以编码形式处理而不是其原始值。

希望能帮到您。


我的问题在于路由,而不是允许的URI字符,我通过将$config ['permitted_uri_chars'] =' ';留空来测试它。 - Waqleh

-1

使用 this->

urldecode(auto_link($url))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接