Apache + PHP 路径中有重音字母

Apache + PHP 路径中有重音字母

如果 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 必须是一个目录
  • 如果我以 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 连接以隐藏实际名称),但我认为这是不可能的。您有关于此主题的更多信息吗?

我的规格包括32位Windows XP Professional SP3,Apache/2.2.13和作为Apache模块运行的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 提供的双字节函数。除非我理解错了,否则这似乎证明我想要做的事根本不可能实现。

答案1

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

您可以尝试以下命令:

mklink /D E:\sites E:\gonzález\sites

Link Shell Extension 是一个免费软件,它与 Windows shell 集成以管理 NTFS 卷上的符号链接(您可以在上面的 Wikipedia 文章中找到链接,或者您可以在任何好的搜索引擎上查找“Link Shell Extension”)。

答案2

对我来说,使用Apache/2.2.8PHP/5.2.5在英国工作正常,require()使用ANSI//编码。UTF-8UTF-8 +BOM

我只是E:/gonzález/从此页面复制了您的示例 ( ),创建了测试脚本 ( ANSI,运行正常),然后测试了各种编码。也许您可以尝试相同的方法?

相关内容