htaccessがどうしても動かないときの対処法をメモしておきます。
要点を抽出しておきます。
- Debian11、Apache 2.4.54では、apache2.confでhtaccessが無効化されていることがある。これが原因でhtaccessが動作しないことが多い。
- AllowOvedrrideの設定が一切なされていない場合、ApacheではデフォルトでAllowOvedrride Allが適用される。
- つまり、
AllowOverride All
を指定しないとhtaccessが効かない場合は、Apacheの設定ファイルのいずれかにAllowOverrideを無効化する設定が書いてあるので、くまなく探そう。
【STEP1】基本の確認
まずはもう一度、間違いやすいポイントを確認しておく。
- AllowOverrideはDirectoryセクションでのみ設定できる。LocationやFileなどほかのタグは不可。
- Directoryタグにはディレクトリのパスを指定する。
- AllowOverrideを設定する場合は、Directoryパスの指定にワイルドカードは使用できない。
<Directory "/var/www/hoge/*">
のようなタグの中で書いても設定は無効である。 - AllowOverrideはコアモジュールで動作するので、モジュールの有効化は不要である。
なお、スペルミスを疑うように促すサイトが多いですが、スペルミスが原因で設定が反映されていない可能性は低いです。理由は設定ファイルにスペルミスがあるとApacheの起動に失敗するから。Apacheが正常に起動できており、エラーが出てなければ、おそらく問題ない。
【STEP2】とりあえずすぐに直したいとき(姑息的手段)
急ぎで直したい方は、htaccessがあるパスのDirectoryタグを追加し、その中にAllowOverride Allと書いておけば、絶対動きます。
例えば、/var/www/html/hoge/.htaccessを効かせたいなら、apacheの設定ファイルに以下のように追記しておけばOK。
<Directory "/var/www/html/hoge">
AllowOverride All
</Directory
これで絶対動きます。
これでも動かないならエラーログを参照しましょう。.htaccessやApacheの設定ファイルにエラーがあるはずです。
【STEP3】「でも、前はいちいちAllowOverride Allしなくても動いてくれたのに」というとき
まずはApacheの設定ファイルについて復習。
そもそも、Directoryタグの設定は親を継承する
例えば、/var/www/htmlのhtaccessについては、
①
<Directory "/var/www/html">
にAllowOverrideの記述があれば、それが反映される。
②なければ、
<Directory "/var/www">
にAllowOverrideの記述があれば、それが反映される。
③なければ
<Directory "/var">
にAllowOverrideの記述があれば、それが反映されます。
このように、Apacheでは親のDirectoryタグを辿りながら適用されていきます。
設定がなれければ?
最終的にAllowOverrideの設定が見つからなければどうなるのでしょうか?
最終的に何も記述が無ければ、Apache2.4の仕様により、AllowOverride Allが適用されます。
これはApacheのドキュメントに記載されています。
core – Apache HTTP サーバ バージョン 2.4
今まで動いていたのにhtaccessが効かなくなった・・・
つまり、AllowOverride Allを指定しないと.htaccessが効かない場合は、必ずどこか(親)にAllowOverrideを無効化する設定が書いてあります。
というわけで、Apacheの設定ファイルをくまなくさがしてみましょう。
Debianでは、/etc/apache2/apache2.confの最後にしれっと大本の設定が書いてある。
# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
#<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
#</Directory>
デフォルトの設定ファイルでAllowOverrideが無効になっている。
このように、Debian11、Apache 2.4.54ではデフォルトでhtaccessが完全無効化されている。だから、htaccessを使う時は、ディレクトリごとにAllowOverrideを記述する必要があるのである。
対処法→/etc/apache2/apache2.confのAllowOverride NoneをAllに変えてやればOK。
これで一件落着となる。
コメント