web-dev-qa-db-ja.com

Apache + PHPアクセント付きの文字が含まれるパス

Windows上のApacheでPHP対応のWebサイトを実行できませんXP DOCUMENT_ROOTへのパスにアクセント付きの文字が含まれている場合、参照していませんスクリプトファイル名はそれ自体ですが、パスコンポーネント内の任意のフォルダに付けられます。

私はこの仮想ホストの定義を持っています:

<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に保存すると、構文エラーが発生します:DocumentRootはディレクトリである必要があります
  • ファイルを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

ディレクトリの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)が含まれています(ただし、WindowsVistaとPHP/5.3.1)。

更新

私はNTFSを使用しており、WindowsコードページはWin-1252です(これはスペイン語版のWindowsです)。おそらくそれは関連しています:-?

アップデート#2

PHP includeまたはrequires、include_pathまたはその他のPHPコードの一部に問題はないことに注意してください。私の問題はPHPインタープリターは、*。php拡張子の付いた静的HTMLドキュメントであっても、PHPスクリプト自体を検出しません。

アップデート#3

さらに読むと、 PHPはWindows APIによって提供される2バイト関数を使用しません のように見えます。私が間違えない限り、これは私がやりたいことが不可能であることを証明しているようです。

4

Apacheは、長いバージョンへのパスを解決してからPHP UTF-8でエンコードされています。PHPファイル関数は、WindowsのANSI APIを使用し、ファイル名のUnicodeを処理できません。

Apache/PHPで同様の問題に直面したことを覚えています。 1つの解決策は、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 ShellExtension」を検索できます)。

5
Bigue Nique

英国では_Apache/2.2.8_と_PHP/5.2.5_、require()ANSI/_UTF-8_/_UTF-8 +BOM_でエンコードされています。

このページから例(_E:/gonzález/_)をコピーし、テストスクリプト(ANSI、正常に動作)を作成してから、さまざまなエンコーディングをテストしました。おそらくあなたは同じ方法を試すことができますか?

1
Andy