_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です。
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でも修正されていることを確認しました。
DirectoryCheckHandler ディレクティブをON
に設定します。
Apacheのドキュメントによると:
2.4.8以降で利用できます。 2.4より前のリリースは、「DirectoryCheckHandlerON」が指定されたかのように暗黙的に機能します。
mod_dir どのハンドラーが設定されていても常にチェックを実行するために使用され、デフォルトのハンドラーを使用しない場合は明示的に有効にする必要があります。