Apache　備忘録

# 設定ファイル

```
httpd.conf
```

# Alias
URLをファイルシステムの位置にマップ
Alias URLパス ディレクトリ|ファイルパス
※URLパスの末尾には/をつけない（/があるものと認識される）
※ディレクトリを指定する場合は最後に/をつける（意図しない挙動を生む場合があるため）

```apache
Alias /apache /Applications/MAMP/htdocs/
```

# Apache リファレンス
http://httpd.apache.org/docs/2.4/mod/quickreference.html

# Directory
指定したディレクトリとサブディレクトリのみで適応される設定

```apache
<Directory ディレクトリ>
# 処理
</Directory>


<Directory "/Applications/MAMP/htdocs/">
    DirectoryIndex xxx.xx
</Directory>
```

# DirectoryIndex
デフォルトで表示されるファイルを指定できる

```apache
DirectoryIndex file1.html
```

#Options
ディレクトリに対して使用可能な機能を設定する

```apache
<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>

<Directory /web/docs/spec>
Options Includes
</Directory>

#/web/docs/spec というディレクトリには、 Includes だけが適用
```

```apache
<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>

<Directory /web/docs/spec>
Options +Includes -Indexes
</Directory>
# /web/docs/spec というディレクトリには、 FollowSymLinks と Includes が適用
```

# htaccess
httpd.conf以外で設定を追加する方法
Directoryでの設定の代わりにフォルダ内に直接配置するイメージ

* AllowOverride Allを設定する
* httpd.confに設定を追加する
* パフォーマンスは落ちる（htaccessがあるかどうかの確認が入るため）
* 配置したディレクトリ、サブディレクトリで有効
* 下位階層で上書き可能

# Redirect
異なるURLに転送する
statusのデフォルトは302
（301:永続的なリダイレクト 302:一時的なリダイレクト）
※URL-pathは前方一致のため無限ループに注意

```apache
Redirect [status] URL-path 飛ばしたいURL

Redirect /apache/redirect-test /apache
```

# 301,302の違い
301:永続的なリダイレクト
⇒キャッシュがブラウザに残るため、あとから設定を変更してもキャッシュを参照するため、反映されない

302:一時的なリダイレクト
⇒キャッシュが残らないため、設定を変更したら問題なく変更が反映される

# LogLevel
どのレベルまでエラーログを出力するかの設定
emerg alert crit error warn（デフォルト） notice info debug がある

# ErrorLog
エラーログの保存場所を指定

# CustomLog
ログファイルの吐き出し場所を指定

# LogFormat
CustomLogの出力フォーマットを決定

http://httpd.apache.org/docs/current/mod/mod_log_config.html

# RewriteRule
URLの書き換え

使用条件

* RewriteEngine Onを前に呼び出す
* Options FollowSymLinks がディレクトリで記述

```apache
RewriteRule Pattern Substitution [flags]
Pattern:Pathにマッチする条件を正規表現で記載（相対パス）
Substitution:書き換え後のパスを指定(フラグのみの場合は"-")
flags:[R]→リダイレクト [L]→処理終了 [F]→403エラー 

RewriteEngine On
RewriteRule rewrite-test/index.html /apache/rewrite-test/tmp.html 

RewriteBase /apache/rewrite-test/
RewriteRule rewrite-test/index.html tmp.html 
# 共通部をRewriteBaseで記載することでURLの省略可能
```
rewriteログの出力

```apache
# ver2.4以上
LogLevel warn rewrite:trace8
```
後方参照
( )でグループ化した部分が後方で$N（1-9）で取得が可能

```apache
RewriteRule rewrite-test/imgs/(\d{3}).jpg imgs/$1.png
```
#RewriteCond
直下のリライトルールの実行条件を記載する

```apache
RewriteCond TestString CondPatter
TestString:テスト文字列
CondPatter:正規表現で表す。()を使うと、後方参照として%1~%9を使用可能

RewriteCond %{HTTP_HOST} ^localhost
RewriteRule .? - [F] #適応
RewriteRule rewrite-test/imgs/(\d{3}).jpg imgs/$1.png #直下じゃないため適応されない

# ...url...?p=file1.htmlなどを取得する方法
RewriteCond %{QUERY_STRING} p=(.+)
RewriteRule rewrite-test/sub1/ sub1/%1? 

# sub2にファイルやディレクトリがない場合はsub1から取得する際の書き方
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule rewrite-test/sub2/(.+) sub1/$1 
```

https://httpd.apache.org/docs/2.4/ja/mod/mod_rewrite.html#RewriteCond

# Webp画像への変更
img,pngで依頼が来た際に、webpが見れるブラウザであれば、webpで返す

```apache
AddType image/webp .webp
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond /Applications/MAMP/htdocs/fullstack-webdev/070_Apacheの基礎/rewrite-test/imgs/$1.webp -f
RewriteRule /?imgs/(.*)\.(jpe?g|png) imgs/$1.webp
```

# サブドメインの追加
/private/etc/hostsに下記が追加されている前提

```
127.0.0.1 dev.local
127.0.0.1 www.dev.local
127.0.0.1 vhost.dev.local
```

```apache
RewriteCond %{HTTP_HOST} ^www\.dev\.local
# RewriteRule (.+) http://dev.local:8888/$1 こっちでも可
RewriteRule .? http://dev.local:8888%{REQUEST_URI} [R=301]

RewriteCond %{HTTP_HOST} ^vhost\.dev\.local
RewriteCond %{REQUEST_URI} !^/apache/rewrite-test/vhost/ # 無限ループ対策
RewriteRule (.*) vhost/$1
```

# gzipの使用
リクエスト側のheaderでAccept-Encoding: gzip, deflate, brとgzipの受け入れが可能な場合、
以下で設定が可能
（mod_deflate, filter_moduleのモジュールは有効でないといけない）

```apache
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript
</IfModule>

DeflateCompressionLevel 9
# 1 (低圧縮) から 9 (高圧縮)
```

# キャッシュ
commang + shiht + rでキャッシュを使わず再リクエストが可能

```apache
<IfModule mod_expires.c>
  ExpiresActive On
  <FilesMatch "\.(png|jpe?g|gif|css|js)$">
    ExpiresDefault "access plus 6 months"
  </FilesMatch>
</IfModule>
```

# KeepAlive
HTTPの持続的な接続を有効にする

```apache
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 1
```