🔥

【Apache】httpメソッドベースでリクエストを制御する方法

2024/07/21に公開

はじめに

Apacheでメソッド単位でルーティングルールを指定する方法を備忘として残します。

構成

簡単に画像の構成を想定しています。

構成図

  1. /v1/salesのGETリクエストの際は、/localhost:8080へルーティング
  2. /v1/~リクエストの際は、/localhost:8090へルーティング
  3. 上記二つ以外は、/var/www/html/配下のルーティングルールに従う

設定値

# APIへのリバースプロキシ設定
RewriteEngine On

# GETリクエストの/v1/salesをポート8080に転送
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} /v1/sales$
RewriteRule /v1/sales http://localhost:8080/sales [P,L]

ProxyPass /v1 http://localhost:8090
ProxyPassReverse /v1 http://localhost:8090

コード解説

RewriteEngine On

RewriteEngine Onは、ApacheのURLリライト機能を有効にするコマンドです。このディレクティブがないと、RewriteRuleやRewriteCondなどのリライト関連の指令が無視されます。

リライト条件の指定

RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} /v1/sales$

RewriteCondはリライト条件を指定するディレクティブで、ここでは2つの条件を設定しています。
最初の条件%{REQUEST_METHOD} GETはHTTPメソッドがGETであるリクエストにのみマッチするよう指定しています。
2番目の条件%{REQUEST_URI} /v1/sales$はリクエストされたURIが/v1/salesで終わる(正確に/v1/salesへのリクエスト)場合にマッチするようにしています。

リライトルールの設定

RewriteRule /v1/sales http://localhost:8080/sales [P,L]

RewriteRuleは実際のURLリライト(またはリダイレクト)を行います。このルールは上記の条件にマッチしたリクエスト(今回は、/v1/salesリクエスト)をhttp://localhost:8080/salesに転送します。

[P]フラグはプロキシを意味し、Apacheがバックエンドのサーバーへリクエストを透過的に転送することを示します(クライアントは転送が行われていることを知りません)。
[L]フラグは「Last」を意味し、このルールが適用された後は他のリライトルールは無視されることを指示します。

リバースプロキシ設定

ProxyPass /v1 http://localhost:8090
ProxyPassReverse /v1 http://localhost:8090

ProxyPassとProxyPassReverseはmod_proxyモジュールのディレクティブで、指定したパスに対するリクエストを指定したサーバーに転送するために使用します。

/v1へのすべてのリクエスト(/v1/sales GET以外も含む)をhttp://localhost:8090に転送します。
ProxyPassReverseはプロキシ応答のHTTPヘッダを適切に書き換え、クライアントが直接サーバーに接続したかのように見せるために使用します。

ProxyPassReverseとRewriteCond設定の違い

ProxyPassとProxyPassReverseは、特定のパスに対するリバースプロキシ設定を簡単に行うために設計されており、構文がシンプルで直感的です。これに対して、RewriteCondとRewriteRuleはより複雑な条件とパターンに基づくリダイレクトやリライトを可能にしますが、設定が複雑になることがあります。

その為、複雑な条件を設定したい場合、RewriteCond/RewriteRuleを用いることが良いと思います。
また、[P]を用いることでプロキシとしても設定可能なため、ProxyPassと同等の役割を担うことが可能です。

Rewriteでフィルターできるものは下記のURLが参考になります。
https://weblabo.oscasierra.net/apache-rewritecond-base/

ProxyPassはリバースプロキシ用に最適化されている為、RewriteRuleを使用するよりもパフォーマンスが良い可能性がある為、極力こちらを使用する方が良いかと思います。

まとめ

今回は、Apacheで複雑なルーティング/プロキシ設定は、Rewrite設定を行うことで可能なことを知ることができました。また、Rewrite設定のProxyPass設定は全く別の役割を担っているものではなく、Rewrite設定がProxyPassを包括している機能と言うことも知りました。

ユーザーのWeb体験を向上させるために、webサーバーの設定や使いどきなどは今後も取り込んでいきたいと思います。

Discussion