Glype Proxy 在 nginx 下 GBK 网页乱码问题
Published by SAGAN Jacques De on October 9th, 2014
Glype 是一个 php 的 web 在线代理程序。最近发现在 nginx + php-fcgi 环境下用 Glype 打开部分 GBK 编码的网站会出现乱码。
这个问题原因是 nginx 中设置了默认字符编码:
charset utf-8;
如果 php 传递给 nginx 的 http header 中的 Content-Type 没有 "charset", 则 nginx 会把设置的默认编码附加上去:
php 发送的原始 header: Content-Type: text/html
nginx 实际发送的 header: Content-Type: text/html; charset=UTF-8
Glype 会原封不动将目标网页的原始 Content-Type header 发送给浏览器。而某些网站(比如百度)的 http header 的 Content-Type 并不包含 charset,如果这些网页内容是非 UTF-8 编码, 在浏览器下就会出现乱码。
workaround (保留 nginx设置不变)
修改 Glype 的 browser.php 文件,在 Request 类的 processHeaders 方法最后加上下面代码:
if( !$charset )
header("Content-Type: " . $mime . '; charset=');
如果网页的 Content-Type 没有 charset,强制设置一个空的 charset 值。
这个问题原因是 nginx 中设置了默认字符编码:
charset utf-8;
如果 php 传递给 nginx 的 http header 中的 Content-Type 没有 "charset", 则 nginx 会把设置的默认编码附加上去:
php 发送的原始 header: Content-Type: text/html
nginx 实际发送的 header: Content-Type: text/html; charset=UTF-8
Glype 会原封不动将目标网页的原始 Content-Type header 发送给浏览器。而某些网站(比如百度)的 http header 的 Content-Type 并不包含 charset,如果这些网页内容是非 UTF-8 编码, 在浏览器下就会出现乱码。
workaround (保留 nginx设置不变)
修改 Glype 的 browser.php 文件,在 Request 类的 processHeaders 方法最后加上下面代码:
if( !$charset )
header("Content-Type: " . $mime . '; charset=');
如果网页的 Content-Type 没有 charset,强制设置一个空的 charset 值。