Apache 2.4 + XSendfile将charset = utf-8附加到内容类型标题

时间:2017-12-13 14:08:02

标签: apache utf-8 character-encoding iso-8859-1 x-sendfile

我们刚刚将我们的一个Web应用程序(经典灯栈)从Ubuntu 14 / Apache 2.2 / PHP 5.5迁移到Ubuntu 16 / Apache 2.4 / PHP 7.0。一切都很顺利。目前只有一部分令我头疼:

我们的应用程序中的一个路由检查传入的文件请求,并通过XSendfile(第三方内容)传递该文件。文件传递的内容类型由应用程序显式设置。这意味着,例如,我们为text/html文件附加了*.html的内容类型。这非常顺利,浏览器收到了确切的内容类型。

现在,在新机器上(相同的代码和要传递的相同文件),浏览器收到的内容类型为text/html;charset=utf-8。内容类型附加了一些字符集元数据。

这对我们来说非常糟糕,因为有些文件包含iso-8859-1个编码内容。结果是显示的html文件中的编码错误。

我检查了一切。我们放置在HTTP标头中的内容类型是明确设置为而不是 utf-8字符集元数据。

现在我正在检查各种Apache2 / XSendfile特定配置,以获取有关该行为的任何提示。

有没有其他人在使用XSendfile的Apache 2.4上遇到过类似的行为?是不是,Apache发送的内容类型比html元标记中的内容类型更重要?如何禁用内容类型标题中charset元信息的自动附加?

1 个答案:

答案 0 :(得分:0)

我遇到了一个完全相同的问题,导致Android应用程序原本期望import sqlite3 from sqlite3 import Error dbs = [] def create_connection(db_file): """ create a database connection to the SQLite database specified by the db_file :param db_file: database file :return: Connection object or None """ try: conn = sqlite3.connect(db_file) return conn except Error as e: print(e) return None def select_all_data(conn): """ Query all rows in the table :param conn: the Connection object :return: """ cur = conn.cursor() cur.execute("SELECT * FROM fund_table") rows = cur.fetchall() for row in rows: print(row) def select_name_and_db(conn): """ Query table by fund_name and db_name :param conn: the Connection object :return: """ cur = conn.cursor() cur.execute("SELECT fund_name, db_name FROM fund_table") rows = cur.fetchall() for row in rows: dbs.append({"fund_name": row[0], "db_name": row[1]}) return dbs def main(): database = "edb.sqlite3" # create a database connection conn = create_connection(database) with conn: """ select_all_data(conn) """ select_name_and_db(conn) main() MIME逐字显示,并发现实际上是更新中更改了PHP配置。在PHP 5.6中,他们将默认的text/html设置从default_charset更改为""

您可以在适当的"UTF-8"中进行更改,也可以在php.ini调用之前简单地添加一个猴子补丁ini_set('default_charset', NULL);

  

default_charset字符串

     

在PHP 5.6及更高版本中,“ UTF-8”是默认值,如果省略了编码参数,则将其值用作htmlentities(),html_entity_decode()和htmlspecialchars()的默认字符编码...      

如果未通过header()调用覆盖标头,则所有版本的PHP都会将此值用作PHP发送的默认Content-Type标头中的字符集。

参考:http://php.net/manual/en/ini.core.php#ini.default-charset