web-dev-qa-db-ja.com

システムレベルのリンクを使用せずに、DocumentRootのサブディレクトリからindex.htmlファイルを提供するにはどうすればよいですか?

システムレベルのリンクを使用せずにDocumentRootのサブディレクトリからindex.htmlファイルを提供するにはどうすればよいですか?

例えば:

  • Apache 2.4仮想ホストのドキュメントルートをdirAとする
  • ベースURL(VirtualHost)をhttp://test.local/とする
  • Index.htmlをdirA/dirB/に常駐させます
  • http://test.local/(ベースURL)がindex.htmlファイルを解決するようにします(ディレクトリのリストは提供しません)。

私はこれを行うためにmodの書き換えを使用しようとしましたが、正規表現とmodの書き換えになじみがありません。動作するルールはRewriteRule . /html/index.html [L]ですが、URLはtest.local/html /(index.htmlファイルが存在する場所)に解決されるため、これは受け入れられません。

必要なのは、ドキュメントルートに対応する正確なURLであり、システムを使用せずに、ドキュメントルートの代わりにドキュメントルート(つまり「html」)のサブディレクトリでindex.htmlファイルを見つけるレベルのシンボリックリンク(つまり、完全にApache内から)。

2
Jacob Fines

@Stephenが提案するmod_rewriteソリューションが必要な場合もありますが、DirectoryIndex(要件に応じて)も考慮する必要があります。

DirectoryIndexドキュメントは、ディレクトリをリクエストしたときにどのファイルを提供するかをApacheに指示します。多くの場合、これは要求されているディレクトリのindex.htmlにデフォルト設定されますが、任意のファイルをどこでも指定できます。例えば:

DirectoryIndex /html/index.html

これは、ディレクトリ(たとえば、ドキュメントルート)を要求するときにルート相対/html/index.htmlファイルを提供するようにApacheに指示します。要求されたディレクトリにindex.htmlが存在する場合は提供し、それ以外の場合は/html/index.htmlを提供する場合は、両方をテストする順序で含めることができます。たとえば、

DirectoryIndex index.html /html/index.html

参照:
https://httpd.Apache.org/docs/2.4/mod/mod_dir.html#directoryindex

2
MrWhite

書き換えルールは近いです。もう少し制限する必要があります。

RewriteRule ^\/?$ /html/index.html [L]

\/は、ホームページの目的のURLであるリテラルスラッシュと一致します。バックスラッシュでエスケープされます。

疑問符はスラッシュをオプションにし、ルールを。htaccessまたはApache 。confファイル内で使用できるようにします。

^はURLパスの始まりと一致し、$はURLパスの終わりと一致します。これらを配置すると、ルールがホームページのみに制限されます。

すべての.htmlファイルをそのサブディレクトリに書き換えたい場合は、ルールを追加することもできます。

RewriteCond %{REQUEST_URI} !^/html/
RewriteRule ^\/?(.*\.html)$ /html/$1 [L]
1