Windows

帶有重音字母的路徑中的 Apache + PHP

  • February 16, 2022

如果 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

您可以嘗試以下命令:

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

Link Shell Extension 是一個免費軟體,它與 Windows shell 集成以管理 NTFS 卷上的符號連結(您可以在上面的 Wikipedia 文章中找到該連結,或者您可以在任何好的搜尋引擎上查找“Link Shell Extension”)。

引用自:https://serverfault.com/questions/123317