【メモ】.htaccessが非推奨な理由

最近Laravelプロジェクトが動く仕組みを調べている初心者です。
XAMPPのドキュメントルートにLaravelプロジェクトを作ったのですが、Laravelプロジェクトのpublic配下にApacheのWebサーバの設定を記述できる.htaccessがありました。.htaccessはhttpd.confで使用できるか否かを設定できるのですがXAMPPのデフォルトでは.htaccessの使用が許可されていました。
ちなみに.htaccessが有効になっている場合はhttpd.confに記載されている内容より優先されます。
Laravelプロジェクトでpublic配下にあるファイルにアクセスしようとすると.htaccessの設定によってindex.phpに集約されるようになっていました。が、仕組みがいまいちわからない。。。
そこで使い方等を調べていたのですがどうやら.htaccessは非推奨でhttpd.confを極力使うのが公式が推奨している方法のようでした。今回は.htaccessが非推奨な理由のメモです。

# .htaccessで設定することが多いURLの書き換え
リクエストURLを別のURLに書き換えるためによく使用されているようです。
例えばリダイレクトで古いURLを新しいURLに書き換えたり、リクエストのアクセスファイルをすべてindex.phpに集約させたりすることで使用されます。
後述しますがこれらの設定はhttpd.confを編集できる場合はhttpd.confで記述がすることが推奨されています。

# .htaccessは基本的に推奨されていません
.htaccessですが基本的に推奨されていないですが唯一使っても良いかなくらいに言われているものがあります。それはレンタルサーバ等で複数ユーザーのサイトを1つのサーバで扱う際に、webサーバの主設定ファイルであるhttpd.confを編集する権限を持たない個々のユーザーが、webサーバの設定の変更を出来るようにするために.htaccessを使う場合です。
>.htaccess ファイルはコンテンツ提供者がディレクトリ毎の 設定を行ないたいけれど、サーバシステムの root アクセス権限を持っていない という場合にのみ使うべきものです。サーバ管理者が頻繁に設定変更を行ないたくは ない、というときには個々のユーザが .htaccess ファイルを使って 自分で設定の変更を行なうことを許可した方が良いときもあるでしょう。 これは特にISPが複数のユーザのサイトを一つのマシンでホストしていて、 各ユーザが設定の変更をできるようにしたいようなときにあてはまります。
https://httpd.apache.org/docs/current/ja/howto/htaccess.html

ただこの場合は.htaccessでできることはhttpd.confの<Directory> セクションでできるらしいのでhttpd.confの<Directory> セクション内に記述することが推奨されています。
例えば/www/htdocs/exampleディレクトリに.htaccessファイルを配置して設定するのと、
httpd.confの`<Directory "/ www / htdocs/example">`セクション内に設定するのとでは完全に同じことらしいです。


# .htaccessの有効・無効の切り替え
.htaccessが知らぬ間に有効になっていると.htaccessの設定が読み込まれて思わぬハプニングが発生してしまうかもしれないのでまずは.htaccessが有効か無効かを切り替える方法を確認します。
.htaccessが使用できるかどうかはhttpd.confにてAllowOverrideディレクティブを設定することで決まります。
AllowOverrideをNoneに設定すると、.htaccessファイルは完全に無視されて読み込まれすらしません。
AllowOverrideをAllに設定すると、コンテキストに.htaccessを含むディレクティブが利用できます。
コンテキストについてですが例えば公式サイトでディレクティブ一覧を見てみるとContext:に.htaccessが含まれているものがあることが分かるかと思います。.htaccessが含まれているものが使用できるということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626978/910278e1-21ce-96eb-0299-ca6364bb80b4.png)
ディレクティブ一覧
https://httpd.apache.org/docs/current/en/mod/core.html
コンテキストについては下記に説明がありました。
https://httpd.apache.org/docs/current/ja/mod/directive-dict.html#Context

AllowOverrideにAuthConfig,FileInfo,Indexes,Limitなど指定することで使用できるディレクティブをAllよりも柔軟に絞ることができます。
まあそもそも.htaccessは非推奨なので今はあまり深くまでは調べません。

```:httpd.confから抜粋
DocumentRoot "D:/XAMPP/XAMPP/htdocs"
<Directory "D:/XAMPP/XAMPP/htdocs">
    Options Indexes FollowSymLinks Includes ExecCGI
    #デフォルトではAllになっていました。
    AllowOverride All
    Require all granted
</Directory>
```

# 非推奨である2つの理由
## サーバの性能問題

一つ目はサーバの性能問題です。
AllowOverrideが有効である(None以外)場合、Apacheは各ディレクトリから.htaccessファイルを探します。

.htaccessは各ディレクトリに配置できるので一人で複数の.htaccessを使用することが可能です。
.htaccessは配置したディレクトリのサブディレクトリにも影響を与えます。そのため上位のディレクトリに.htaccessがある場合、その考慮も必要ということになります。
Apacheはそんな点在する.htaccessを下位～上位のディレクトリで探す必要があります。
例えば`/www/htdocs/example`にあるファイルがリクエストされた場合、Apacheは以下のファイルがあっても無くても探します。
```
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
```
しかもリクエストがされる度に.htaccessファイルを探し始めます。
ここまで聞けばサーバの性能の低下を招くことが理解できたと思います。

## セキュリティの問題
2つめはセキュリティの問題です。
ユーザーがサーバーの設定を変更(上書き)できるということはユーザーがどのディレクティブを設定変更できるのかを把握する必要があります。よく考慮せずに.htaccessで許可されるすべてのディレクティブを変更可能にしてしまうと想定外のセキュリティ問題が起きるかもしれません。
もし.htaccessを使えるようにする場合は、何が設定できて、何が設定できないのかを明確にする必要がありそうです。

# メモ
.htaccessが非推奨でhttpd.confが推奨であることは分かりました。
設定の記述の仕方は大きく違わないようなのでよく使われているURLの書き換えを実践してみようと思います。