特定汉字在 http get 请求期间被错误编码

Specific kanji gets wrongly encoded during http get request

在我正在开发的应用程序中使用汉字时,我遇到了一个非常奇怪的编码问题;除了字符“免”之外的所有汉字字符都可以正常工作。 当我尝试使用此字符时,mongodb 抛出以下异常:

Exception: non-utf8 string: � 

任何其他汉字字符都可以。

我曾尝试删除处理字符串的函数,并将其直接输入到处理函数 mongodb 但没有成功。 我也尝试过从各种编码转换字符,但无济于事。

这是我正在使用的:

谢谢!

处理请求的控制器函数

public function kanjiAction($findKanji = "")
{
    // Really weird issue with the kanji 免 not working

    $findKanji = $this->filter->sanitize($findKanji, 'string');
    $findKanji = mb_substr($findKanji, 0, 1, 'UTF-8');

    $kanjiHash = md5($findKanji);

    // If entry does not exist in cache, create it
    if(!$this->viewCache->exists($kanjiHash)) {

        // Get data from DB
        $kanji = Kanji::findById($findKanji);

        $words = Words::containingKanji($findKanji);

        $showWords = array();

        foreach ($words as $word) {
            foreach ($word->k_ele["keb"] as $key => $value) {
                if(strpos($value, $findKanji) != false) {
                    $showWords[] = (object) array(
                        "word" => $value,
                        "readings" => $word->r_ele["reb"],
                        "meanings" => $word->sense["gloss"]
                    );
                    break;
                }
            }
        }

        // Fetch translations
        $this->view->onTitle = $this->translation->query('onTitle');
        $this->view->kunTitle = $this->translation->query('kunTitle');
        $this->view->radicalTitle = $this->translation->query('radicalTitle');
        $this->view->meaningsTitle = $this->translation->query('meaningsTitle');
        $this->view->strokeCountTitle = $this->translation->query('strokeCountTitle');
        $this->view->jlptTitle = $this->translation->query('jlptTitle');
        $this->view->containsWordsTitle = $this->translation->query('containsWordsTitle');
        $this->view->readingsTitle = $this->translation->query('readingsTitle');
        $this->view->wordsTitle = $this->translation->query('wordsTitle');
        $this->view->notFound = $this->translation->query('notFound');

        // Pass data to view
        $this->view->kanji = $kanji->_id;
        if(isset($kanji->reading["on"]) && count($kanji->reading["on"]) > 0)
            $this->view->onReadings = $kanji->reading["on"];
        if(isset($kanji->reading["kun"]) && count($kanji->reading["kun"]) > 0)
            $this->view->kunReadings = $kanji->reading["kun"];
        if(isset($kanji->radicals))
            $this->view->radicals = $kanji->radicals;
        if(isset($kanji->attributes['jlpt']))
            $this->view->jlpt = $kanji->attributes['jlpt'];
        if(isset($kanji->attributes['stroke_count']))
            $this->view->strokeCount = $kanji->attributes['stroke_count'];
        if(isset($kanji->meaning))
            $this->view->meanings = $kanji->meaning;
        if(count($showWords) > 0) 
            $this->view->words = $showWords;

        $this->view->kanjiHash = $kanjiHash;
    } else {
        $this->view->kanjiHash = $kanjiHash;
    }
}

请求 Header non-working 汉字:

GET /view/kanji/%E5%85%8D HTTP/1.1
Host: localhost
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: sv-SE,sv;q=0.8,en-US;q=0.6,en;q=0.4

对non-working汉字的响应header:

HTTP/1.1 200 OK
Date: Fri, 03 Jul 2015 13:04:05 GMT
Server: Apache/2.4.12 (Win32) OpenSSL/1.0.1l PHP/5.6.8
X-Powered-By: PHP/5.6.8
Content-Length: 29
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

请求 Header 工作汉字:

GET /view/kanji/%E5%A8%A9 HTTP/1.1
Host: localhost
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: sv-SE,sv;q=0.8,en-US;q=0.6,en;q=0.4

工作汉字的响应header:

HTTP/1.1 200 OK
Date: Fri, 03 Jul 2015 13:16:20 GMT
Server: Apache/2.4.12 (Win32) OpenSSL/1.0.1l PHP/5.6.8
X-Powered-By: PHP/5.6.8
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8

编辑:

免的堆栈跟踪:

#0 [internal function]: MongoCursor->rewind()
#1 [internal function]: Phalcon\Mvc\Collection::_getResultset(Array, Object(Purple\Model\Kanji), Object(MongoDB), true)
#2 [internal function]: Phalcon\Mvc\Collection::findFirst(Array)
#3 E:\xampp\htdocs\app\Purple\Controller\ViewController.php(33): Phalcon\Mvc\Collection::findById('\xE5')
#4 [internal function]: Purple\Controller\ViewController->kanjiAction('\xE5')
#5 [internal function]: Phalcon\Dispatcher->dispatch()
#6 E:\xampp\htdocs\public\index.php(98): Phalcon\Mvc\Application->handle()
#7 {main}

编辑 2:

[Mon Jul 06 18:05:59.294298 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f045c0/initial] [perdir E:/xampp/htdocs/] add path info postfix: E:/xampp/htdocs/view -> E:/xampp/htdocs/view/kanji/\xe5\x85\x8d
[Mon Jul 06 18:05:59.294798 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f045c0/initial] [perdir E:/xampp/htdocs/] strip per-dir prefix: E:/xampp/htdocs/view/kanji/\xe5\x85\x8d -> view/kanji/\xe5\x85\x8d
[Mon Jul 06 18:05:59.294798 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f045c0/initial] [perdir E:/xampp/htdocs/] applying pattern '^$' to uri 'view/kanji/\xe5\x85\x8d'
[Mon Jul 06 18:05:59.294798 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f045c0/initial] [perdir E:/xampp/htdocs/] add path info postfix: E:/xampp/htdocs/view -> E:/xampp/htdocs/view/kanji/\xe5\x85\x8d
[Mon Jul 06 18:05:59.294798 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f045c0/initial] [perdir E:/xampp/htdocs/] strip per-dir prefix: E:/xampp/htdocs/view/kanji/\xe5\x85\x8d -> view/kanji/\xe5\x85\x8d
[Mon Jul 06 18:05:59.294798 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f045c0/initial] [perdir E:/xampp/htdocs/] applying pattern '(.*)' to uri 'view/kanji/\xe5\x85\x8d'
[Mon Jul 06 18:05:59.294798 2015] [rewrite:trace2] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f045c0/initial] [perdir E:/xampp/htdocs/] rewrite 'view/kanji/\xe5\x85\x8d' -> 'public/view/kanji/\xe5'
[Mon Jul 06 18:05:59.294798 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f045c0/initial] [perdir E:/xampp/htdocs/] add per-dir prefix: public/view/kanji/\xe5 -> E:/xampp/htdocs/public/view/kanji/\xe5
[Mon Jul 06 18:05:59.294798 2015] [rewrite:trace2] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f045c0/initial] [perdir E:/xampp/htdocs/] strip document_root prefix: E:/xampp/htdocs/public/view/kanji/\xe5 -> /public/view/kanji/\xe5
[Mon Jul 06 18:05:59.294798 2015] [rewrite:trace1] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f045c0/initial] [perdir E:/xampp/htdocs/] internal redirect with /public/view/kanji/\xe5 [INTERNAL REDIRECT]
[Mon Jul 06 18:05:59.296799 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f06278/initial/redir#1] [perdir E:/xampp/htdocs/public/] add path info postfix: E:/xampp/htdocs/public/view -> E:/xampp/htdocs/public/view/kanji/\xe5
[Mon Jul 06 18:05:59.296799 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f06278/initial/redir#1] [perdir E:/xampp/htdocs/public/] strip per-dir prefix: E:/xampp/htdocs/public/view/kanji/\xe5 -> view/kanji/\xe5
[Mon Jul 06 18:05:59.317801 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f06278/initial/redir#1] [perdir E:/xampp/htdocs/public/] applying pattern '^(.*)$' to uri 'view/kanji/\xe5'
[Mon Jul 06 18:05:59.318301 2015] [rewrite:trace2] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f06278/initial/redir#1] [perdir E:/xampp/htdocs/public/] rewrite 'view/kanji/\xe5' -> 'index.php?_url=/view/kanji/\xe5'
[Mon Jul 06 18:05:59.318301 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f06278/initial/redir#1] split uri=index.php?_url=/view/kanji/\xe5 -> uri=index.php, args=_url=/view/kanji/\xe5
[Mon Jul 06 18:05:59.318301 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f06278/initial/redir#1] [perdir E:/xampp/htdocs/public/] add per-dir prefix: index.php -> E:/xampp/htdocs/public/index.php
[Mon Jul 06 18:05:59.318301 2015] [rewrite:trace2] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f06278/initial/redir#1] [perdir E:/xampp/htdocs/public/] strip document_root prefix: E:/xampp/htdocs/public/index.php -> /public/index.php
[Mon Jul 06 18:05:59.318301 2015] [rewrite:trace1] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f06278/initial/redir#1] [perdir E:/xampp/htdocs/public/] internal redirect with /public/index.php [INTERNAL REDIRECT]
[Mon Jul 06 18:05:59.318301 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f0d7d8/initial/redir#2] [perdir E:/xampp/htdocs/public/] strip per-dir prefix: E:/xampp/htdocs/public/index.php -> index.php
[Mon Jul 06 18:05:59.318301 2015] [rewrite:trace3] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f0d7d8/initial/redir#2] [perdir E:/xampp/htdocs/public/] applying pattern '^(.*)$' to uri 'index.php'
[Mon Jul 06 18:05:59.318801 2015] [rewrite:trace1] [pid 5728:tid 2180] mod_rewrite.c(475): [client 127.0.0.1:52741] 127.0.0.1 - - [localhost/sid#3dac08][rid#3f0d7d8/initial/redir#2] [perdir E:/xampp/htdocs/public/] pass through E:/xampp/htdocs/public/index.php

编辑 3:

[Tue Jul 07 01:25:18.844429 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f240c8/initial] [perdir E:/xampp/htdocs/] add path info postfix: E:/xampp/htdocs/view -> E:/xampp/htdocs/view/kanji/\xe5\x85\x8d
[Tue Jul 07 01:25:18.844429 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f240c8/initial] [perdir E:/xampp/htdocs/] strip per-dir prefix: E:/xampp/htdocs/view/kanji/\xe5\x85\x8d -> view/kanji/\xe5\x85\x8d
[Tue Jul 07 01:25:18.844429 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f240c8/initial] [perdir E:/xampp/htdocs/] applying pattern '^$' to uri 'view/kanji/\xe5\x85\x8d'
[Tue Jul 07 01:25:18.844429 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f240c8/initial] [perdir E:/xampp/htdocs/] add path info postfix: E:/xampp/htdocs/view -> E:/xampp/htdocs/view/kanji/\xe5\x85\x8d
[Tue Jul 07 01:25:18.844429 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f240c8/initial] [perdir E:/xampp/htdocs/] strip per-dir prefix: E:/xampp/htdocs/view/kanji/\xe5\x85\x8d -> view/kanji/\xe5\x85\x8d
[Tue Jul 07 01:25:18.844929 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f240c8/initial] [perdir E:/xampp/htdocs/] applying pattern '(.*)' to uri 'view/kanji/\xe5\x85\x8d'
[Tue Jul 07 01:25:18.844929 2015] [rewrite:trace2] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f240c8/initial] [perdir E:/xampp/htdocs/] rewrite 'view/kanji/\xe5\x85\x8d' -> 'public/view%2fkanji%2f%e5'
[Tue Jul 07 01:25:18.844929 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f240c8/initial] [perdir E:/xampp/htdocs/] add per-dir prefix: public/view%2fkanji%2f%e5 -> E:/xampp/htdocs/public/view%2fkanji%2f%e5
[Tue Jul 07 01:25:18.844929 2015] [rewrite:trace2] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f240c8/initial] [perdir E:/xampp/htdocs/] strip document_root prefix: E:/xampp/htdocs/public/view%2fkanji%2f%e5 -> /public/view%2fkanji%2f%e5
[Tue Jul 07 01:25:18.844929 2015] [rewrite:trace1] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f240c8/initial] [perdir E:/xampp/htdocs/] internal redirect with /public/view%2fkanji%2f%e5 [INTERNAL REDIRECT]
[Tue Jul 07 01:25:18.849429 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f25e28/initial/redir#1] [perdir E:/xampp/htdocs/public/] add path info postfix: E:/xampp/htdocs/public/view -> E:/xampp/htdocs/public/view/kanji/\xe5
[Tue Jul 07 01:25:18.849429 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f25e28/initial/redir#1] [perdir E:/xampp/htdocs/public/] strip per-dir prefix: E:/xampp/htdocs/public/view/kanji/\xe5 -> view/kanji/\xe5
[Tue Jul 07 01:25:18.849429 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f25e28/initial/redir#1] [perdir E:/xampp/htdocs/public/] applying pattern '^(.*)$' to uri 'view/kanji/\xe5'
[Tue Jul 07 01:25:18.849429 2015] [rewrite:trace2] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f25e28/initial/redir#1] [perdir E:/xampp/htdocs/public/] rewrite 'view/kanji/\xe5' -> 'index.php?_url=/view%2fkanji%2f%e5'
[Tue Jul 07 01:25:18.849429 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f25e28/initial/redir#1] split uri=index.php?_url=/view%2fkanji%2f%e5 -> uri=index.php, args=_url=/view%2fkanji%2f%e5
[Tue Jul 07 01:25:18.849429 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f25e28/initial/redir#1] [perdir E:/xampp/htdocs/public/] add per-dir prefix: index.php -> E:/xampp/htdocs/public/index.php
[Tue Jul 07 01:25:18.849429 2015] [rewrite:trace2] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f25e28/initial/redir#1] [perdir E:/xampp/htdocs/public/] strip document_root prefix: E:/xampp/htdocs/public/index.php -> /public/index.php
[Tue Jul 07 01:25:18.849429 2015] [rewrite:trace1] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f25e28/initial/redir#1] [perdir E:/xampp/htdocs/public/] internal redirect with /public/index.php [INTERNAL REDIRECT]
[Tue Jul 07 01:25:18.849930 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f2d448/initial/redir#2] [perdir E:/xampp/htdocs/public/] strip per-dir prefix: E:/xampp/htdocs/public/index.php -> index.php
[Tue Jul 07 01:25:18.849930 2015] [rewrite:trace3] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f2d448/initial/redir#2] [perdir E:/xampp/htdocs/public/] applying pattern '^(.*)$' to uri 'index.php'
[Tue Jul 07 01:25:18.850430 2015] [rewrite:trace1] [pid 7480:tid 2176] mod_rewrite.c(475): [client 127.0.0.1:63967] 127.0.0.1 - - [localhost/sid#5fac08][rid#3f2d448/initial/redir#2] [perdir E:/xampp/htdocs/public/] pass through E:/xampp/htdocs/public/index.php

从你的堆栈跟踪来看,似乎有东西在到达你的控制器之前剥离了 $findKanji 的一部分。在对 kanjiAction.

的调用中,没有代表免费的三个字节,只有第一个字节

另一个失败的汉字也包含一个 0x85 字节,所以我想知道在你点击你的控制器之前是否有东西一旦点击字节 0x85.[=47= 就会剥离所有字节]

所以现在您需要在参数到达您的控制器之前查看可能会干扰您的参数的内容。您是否有任何事件侦听器附加到 dispatch:beforeDispatchLoop 或任何 dispatch 事件? (如果是,那是什么?)

我会注意到我刚刚从头开始制作了一个 phalcon 应用程序(按照教程)来查看我得到的堆栈跟踪并且我得到了堆栈跟踪:

Exception: Because I can
 File=/var/www/tutorial/app/controllers/ViewController.php
 Line=15
#0 [internal function]: ViewController->kanjiAction('???')
#1 [internal function]: Phalcon\Dispatcher->dispatch()
#2 /var/www/tutorial/public/index.php(39): Phalcon\Mvc\Application->handle()
#3 {main}

注意传递给 kanjiAction 的三个字符:如果我点击 url /view/kanji/%E5 我只会得到一个字符。

这是一个简化的控制器,它的存在只是为了提供堆栈跟踪:

<?php

use Phalcon\Mvc\Controller;

class ViewController extends Controller
{

    public function indexAction()
    {
    }

    public function kanjiAction($findKanji = "")
    {
        var_dump($findKanji);
        throw new Exception('Because I can');
    }
}

这是使用 Phalcon 2.0.1。所以我们知道香草 phalcon 应用程序将所有三个字节向下传递给处理程序,至少在我的 ubuntu 和 Apache 2.2.

设置中是这样

看看我的设置(显然有效)和你的设置之间的差异,我想知道差异是否与 Windows 上的 Apache 重写规则有关。因此,让我们将重写过程的调试调高。因为你有 Apache 2.4,这是通过放置这个指令来完成的:

LogLevel alert rewrite:trace3

进入服务器配置文件中的 <VirtualHost> 部分。

完成后,使用 apache 日志中包含 [rewrite: 的行更新答案,这些行是在您尝试访问其中一个错误的汉字时生成的。


编辑:现在您已经包含了这些信息,我想我已经解决了。

我不知道您为什么会遇到这样的问题。我将单独尝试重现它,以便我可以用 apache 提交错误(尽管我可能无法做到,直到我得到一个 windows 框),但与此同时我想我有一个修复。

首先,在服务器配置文件的 <VirtualHost> 部分添加此指令:

AllowEncodedSlashes On

然后,假设您已经按照 Phalcon 教程中的方式设置了 .htaccess 文件,将 B 选项添加到顶级目录 [=29= 中的第二个 RewriteRule ] 文件,以便该行看起来像:

RewriteRule  (.*) public/ [B,L]

然后在public/目录下的.htaccess文件中的RewriteRule行也加上B标志,这样该行就变成了:

RewriteRule ^(.*)$ index.php?_url=/ [B,QSA,L]

第二次更改 可能 没有必要;由于我没有能解决您确切问题的系统,因此我无法检查。


仍然不走运,但让我们再试一件事:将 (.*) 变成 ((?s).*) 以便现在修改的行变为:

RewriteRule  ((?s).*) public/ [B,L]

RewriteRule ^((?s).*)$ index.php?_url=/ [B,QSA,L]

假设这可行,其背后的原因很奇怪。

显然,字符 0x85 是 Unicode 中的 "next line" 字符,PCRE(Apache 重写功能的正则表达式引擎)可以将其视为换行符 as detailed here。 PCRE 编译的正常方式是只将字符 10 视为换行符,(\n) 但 PCRE 可以编译为将更多字符视为换行符。

当字符是 "newline" 字符时,正则表达式元字符 . 不会匹配它,除非 s 正则表达式选项处于活动状态。 (?s) 位使该选项处于活动状态。

如果可行,您可以删除 RewriteRules 上的 B 选项,并从 <VirtualHost>.

中删除 AllowEncodedSlashes 指令

您使用的是本地编译的 apache 二进制文件,还是从官方渠道获得的?因为如果你从官方那里得到一个,你应该抱怨他们用这个奇怪的选项编译 PCRE 浪费了你的周末。