德国特殊字符的URI不Zend框架2工作(错误404)(URIs with german speci

2019-07-23 11:29发布

我想要得到的城市,每个城市的名字相连,是指对这个城市的页面的列表:

这些链接(在视图中创建脚本)是这样的:

http://project.loc/catalog/Berlin (in the HTML source code url-encoded: Berlin)
http://project.loc/catalog/Erlangen (in the HTML source code url-encoded: Erlangen)
http://project.loc/catalog/Nürnberg (in the HTML source code url-encoded: N%C3%BCrnberg)

“柏林”,“埃尔兰根”等方面的工作,但如果城市名称中包含特殊德语字符( äöüÄÖÜ ,或ß )像“纽伦堡”,一个发生404错误:

发生404错误页面没有找到。 所请求的网址无法通过路由匹配。 无异常

为什么? 而如何得到这个工作?

提前致谢!

编辑:

我的路由器设置:

'router' => array(
    'routes' => array(
        'catalog' => array(
            'type'  => 'literal',
            'options' => array(
                'route' => '/catalog',
                'defaults' => array(
                    'controller' => 'Catalog\Controller\Catalog',
                    'action'     => 'list-cities',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'city' => array(
                    'type'  => 'segment',
                    'options' => array(
                        'route' => '/:city',
                        'constraints' => array(
                            'city'  => '[a-zA-ZäöüÄÖÜß0-9_-]*',
                        ),
                        'defaults' => array(
                            'controller' => 'Catalog\Controller\Catalog',
                            'action'     => 'list-sports',
                        ),
                    ),
                    'may_terminate' => true,
                    'child_routes' => array(
                    // ...
                    ),
                ),
            ),
        ),
    ),
),

Answer 1:

你需要改变你的约束,你可以使用正则表达式将匹配UTF8字符,像这样:

'/[\p{L}]+/u'

注意/ U修饰符(UNICODE)。

编辑:

问题是解决了 。

说明:

Regex路由maches中的URI与preg_match(...)线116或118的Zend \的mvc \路由器\ HTTP \正则表达式)。 为了马赫用“特殊字符”的字符串(128+)必须通过模式修改upreg_match(...) 像这样:

$thisRegex = '/catalog/(?<city>[\p{L}]*)';
$regexStr = '(^' . $thisRegex . '$)u'; // <-- here
$path = '/catalog/Nürnberg';
$matches = array();
preg_match($regexStr, $path, $matches);

而且,由于正则表达式路线通过一个URL enccoded字符串preg_match(...)这是字符串解码首先需要furthermode:

$thisRegex = '/catalog/(?<city>[\p{L}]*)';
$regexStr = '(^' . $thisRegex . '$)u';
$path = rawurldecode('/catalog/N%C3%BCrnberg');
$matches = array();
preg_match($regexStr, $path, $matches);

未在Regex路由提供这两个步骤,从而使preg_match(...)得到一个steing像'/catalog/N%C3%BCrnberg'和尝试将其马赫像一个正则表达式'/catalog/(?<city>[\\p{L}]*)/u'

解决办法是使用自定义的正则表达式路线。 这里是一个例子。



文章来源: URIs with german special characters don't work (error 404) in Zend Framework 2