web-dev-qa-db-ja.com

書き換えられたURLに対してDirectoryIndexが正しく機能しない

_domain.com_と_sub.domain.com_が同じサーバーを指しているので、mod_rewriteを使用して_sub.domain.com_のURLをsubサブディレクトリに書き換えています。ドキュメントルートに次の_.htaccess_ファイルがあります。

_DirectoryIndex index.html index.php

# Prevent infinite rewrite loop.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
# Send all requests addressing sub.domain.com...
RewriteCond %{HTTP_Host} =sub.domain.com [NC]
# ...to the /sub directory.
RewriteRule ^ /sub%{REQUEST_URI} [QSA]
_

subディレクトリ内に_index.php_があり、_index.html_はありませんが、_http://sub.domain.com_へのリクエストは_index.php_を完全に無視し、404を返すようです。_index.html_ただし、提供されます。 _index.php_を提供する唯一の方法は、設定することです

_DirectoryIndex index.php
_

しかし、それは私がサイト全体でやりたいことではありません。

奇妙なことに、ドキュメントルート以外のURLは通常のDirectoryIndex動作を示します。たとえば、_http://sub.domain.com/search_は、404を返す前に_sub/search/index.html_を検索してから_sub/search/index.php_を検索しようとします。

親ドメイン_http://domain.com/sub_からsubディレクトリをクエリすると、_index.php_が表示されるため、この問題に完全に戸惑うことになります。

Apacheエラーログを含めますが、共有ホスティングを使用しており、ログの詳細度を上げる方法がありません。また、このエラーをローカルで再現することもできませんでした。 WebホスティングサーバーはApache2.4.3を使用しており、私のローカルサーバーはApache2.4.9です。

4
mxxk

Apache2.4.7を含むUbuntu14.04にアップグレードした後、同様の問題が発生します。

これが私の回避策です。 エミュレートmod_dir with mod_rewrite、およびDirectoryIndexを無効にします。

#DirectoryIndex index.html index.php index.htm
DirectoryIndex disabled

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} /$
RewriteCond %{REQUEST_FILENAME}index.html -f
RewriteRule ^(.*)$ $1index.html  [L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} /$
RewriteCond %{REQUEST_FILENAME}index.php -f
RewriteRule ^(.*)$ $1index.php  [L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} /$
RewriteCond %{REQUEST_FILENAME}index.htm -f
RewriteRule ^(.*)$ $1index.htm  [L]

お役に立てれば。


[〜#〜] update [〜#〜]:Apache 2.4.10にアップグレードすると、問題が修正されます。

おかげで OndřejSurý これはUbuntu14.04でaptを使用して簡単に行うことができます:

add-apt-repository ppa:ondrej/Apache2
apt-get update
apt-get install Apache2

p.s. OPは、これがApache2.4.9でも修正されていることを確認しました。

2
howanghk

DirectoryCheckHandler ディレクティブをONに設定します。

Apacheのドキュメントによると:

2.4.8以降で利用できます。 2.4より前のリリースは、「DirectoryCheckHandlerON」が指定されたかのように暗黙的に機能します。

mod_dir どのハンドラーが設定されていても常にチェックを実行するために使用され、デフォルトのハンドラーを使用しない場合は明示的に有効にする必要があります。

1
J.Money