如果 DOCUMENT_ROOT 的路径包含重音字母,我将无法在 Windows XP 上的 Apache 下运行启用 PHP 的网站。我指的不是脚本文件名本身,而是路径组件中的任何文件夹。
我有这个虚拟主机定义:
<VirtualHost *:80>
ServerName foo.local
DocumentRoot "E:/gonzález/sites/foo"
ErrorLog logs/foo.local-error.log
CustomLog logs/foo.local-access.log combined
<Directory "E:/gonzález/sites/foo">
AllowOverride All
Options Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
- 如果我将文件保存在 ANSI (Windows-1252) 中,则会出现语法错误:DocumentRoot must be a directory
- 如果我以 Unicode (UTF-16) 格式保存文件,我会收到另一个语法错误:无效命令 '\xff\xfe#',可能拼写错误或由未包含在服务器配置中的模块定义(看起来它在抱怨 BOM)
- 如果我将文件保存在无 BOM 的 UTF-8 中,Apache 工作正常,并且它提供静态文件而没有明显问题......
...但是,加载任何 *.php 文件(甚至是空文件)时的 PHP 投诉:
Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0
Fatal error: Unknown: Failed opening required 'E:/gonzález/sites/foo/vacio.php' (include_path='.;C:\Archivos de programa\PHP\pear') in Unknown on line 0
我决定尝试使用 8+3 的目录短名称(只是一个测试,我不想使用这样的变通方法):
<VirtualHost *:80>
ServerName foo.local
DocumentRoot "E:/GONZLE~1/sites/foo"
ErrorLog logs/foo.local-error.log
CustomLog logs/foo.local-access.log combined
<Directory "E:/GONZLE~1/sites/foo">
AllowOverride All
Options Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
但我得到相同的行为:
Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0
Fatal error: Unknown: Failed opening required 'E:/gonzález/sites/foo/vacio.php' (include_path='.;C:\Archivos de programa\PHP\pear') in Unknown on line 0
虽然有明显的解决方法(在所有目录名称中使用纯 ASCII 或创建 NTFS 连接来隐藏实际名称),但我不敢相信这是无法做到的。你有关于这个主题的更多信息吗?
我的规格包括作为 Apache 模块运行的 32 位 Windows XP Professional SP3、Apache/2.2.13 和 PHP/5.2.11(但我在另一个使用 Windows Vista 和 PHP/5.3.1 的盒子中注意到了同样的问题)。
更新
我正在使用 NTFS,Windows 代码页是 Win-1252(它是 Windows 的西班牙语言版本)。也许它是相关的:-?
更新#2
我说我没有遇到 PHP 包含或需要、include_path 或任何其他 PHP 代码的问题。我的问题是 PHP 解释器不会找到 PHP 脚本本身,即使它是带有 *.php 扩展名的静态 HTML 文档。
更新#3
进一步阅读,PHP 似乎没有使用 Windows API 提供的双字节函数。除非我弄错了,否则这似乎证明了我想做的事情是不可能的。
似乎 Apache 在将其传递给以 UTF-8 编码的 PHP 之前解析了它的长版本的路径。PHP 文件函数使用 Windows 的 ANSI API,无法处理文件名中的 Unicode。
我记得 Apache/PHP 也遇到过类似的问题。一种解决方案是使用仅避免 Unicode 字符的名称创建某种 NTFS 符号链接到您的文件夹。
例如:E:\sites => E:\gonzález\sites
维基百科上的 NTFS 符号链接: http ://en.wikipedia.org/wiki/NTFS_symbolic_link
您可以从 Microsoft 获取 mklink.exe 实用程序以从命令行创建此类链接: http ://technet.microsoft.com/en-us/library/cc753194(WS.10).aspx
您可以尝试以下命令:
Link Shell Extension 是一个免费软件,它与 Windows shell 集成以管理 NTFS 卷上的符号链接(您可以在上面的 Wikipedia 文章中找到该链接,或者您可以在任何好的搜索引擎上查找“Link Shell Extension”)。
Apache/2.2.8
在英国和PHP/5.2.5
英国都可以正常工作,以/ /require()
编码。ANSI
UTF-8
UTF-8 +BOM
我刚刚从该页面复制了您的示例 (
E:/gonzález/
),创建了测试脚本 (ANSI
,工作正常),然后测试了各种编码。也许您可以尝试相同的方法?