带有重音字母的路径中的 Apache + PHP

Álv*_*lez 4 windows php php5 apache-2.2

如果 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>
Run Code Online (Sandbox Code Playgroud)
  • 如果我将文件保存在 ANSI 中,则会出现语法错误:DocumentRoot must be a directory
  • 如果我以 Unicode 保存文件,我会收到另一个语法错误:无效命令 '\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
Run Code Online (Sandbox Code Playgroud)

我决定试试目录的 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>
Run Code Online (Sandbox Code Playgroud)

但我得到了相同的行为:

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
Run Code Online (Sandbox Code Playgroud)

虽然有明显的解决方法(在所有目录名称中使用纯 ASCII 或创建 NTFS 连接以隐藏实际名称),但我无法相信这无法完成。你有关于这个主题的更多信息吗?

我的规格包括 32 位 Windows XP Professional SP3、Apache/2.2.13 和 PHP/5.2.11 作为 Apache 模块运行(但我在另一个装有 Windows Vista 和 PHP/5.3.1 的盒子中注意到了同样的问题)。

更新

我使用的是 NTFS,Windows 代码页是 Win-1252(它是 Windows 的西班牙语语言版本)。也许它是相关的:-?

更新 #2

我注意到我在使用 PHP 包含或需要、include_path 或任何其他 PHP 代码时没有问题。我的问题是 PHP 解释器不会找到 PHP 脚本本身,即使它是带有 *.php 扩展名的静态 HTML 文档。

更新 #3

进一步阅读后,PHP 似乎没有使用 Windows API 提供的双字节函数。除非我弄错了,这似乎证明我想做的事情是不可能的。

小智 5

似乎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
Run Code Online (Sandbox Code Playgroud)

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