【Apache】 [RewriteRule] リライトでURLを書き換える方法と意味を理解する

Apache

ApacheでURLを書き換える[RewriteRule] リライトの基本的な使い方を紹介します。 また、RewriteEngine、FollowSymLinks、RewriteRule、RewriteBaseなどの意味と使い方を説明します。

[RewriteRule] を使うための準備

RewriteRuleのコンテキストは、サーバー設定, バーチャルホスト, ディレクトリ, .htaccessです。そのためどこでも使えます。 RewriteRuleを使うためには、以下の二点を必ず行う必要があります。
  • 「RewriteEngine On」として、RewriteRuleの前に呼び出す
  • 「Options FollowSymLinks」をディレクトリで記述する
基本的にApacheでは、Options FollowSymLinksは有効になっています。
<Directory />
    Options Indexes FollowSymLinks
    AllowOverride None
</Directory>
上のような記述があればOKです。

[RewriteRule] の基本的な書き方の説明

RewriteRule Pattern Substitution [flags]
Patternを記述して、Pathにマッチする条件を正規表現で表現します。 そして、Substitutionで置換します。 Patternのパスを書くときは、.htaccessのある階層からの相対パスで記載します。 Substitutionはドメイン以降のパスを書く必要があります。 リライトに似ていますが、より柔軟に使用できます。 flagsは、オプションで指定してもいいししなくてもいいです。

Substitutionで指定できるもの

・URL-path: ドメイン以下のパスによる指定です。 一番最初のパスがルートディレクトリに存在しない場合にURL-pathとして認識します。 以下が例です。
RewriteRule some-folder/index.html /alias/new-file-name.html
・file-system path: PC上のディレクトリ、またはファイルへの絶対パスです。 windowsの場合はCドライブなどからのフルパスを記載します。 このfile-system pathが使えるのは、サーバ設定ファイルかバーチャルホストになるため、.htaccessファイル内では使えません。 以下が例です。
RewriteRule some-folder/index.html /Applications/MAMP/logs
・Absolute URL: http~の絶対URLです。 外部リンクなどです。 以下が例です。
RewriteRule some-folder/index.html https://news.yahoo.co.jp/
・- (dash) 書き換えしない(フラグのみ使用) フラグのみ使用する際に使用します。 以下が例です。
RewriteRule some-folder/index.html - [F]

Flagsについて

[R=code]
上のように記述します。 Rとした場合はリダイレクトします。 R=301とすると301リダイレクトを行います。 [L] 処理を終了します。以降のRewriteRuleは実行しないという意味になります。 [F] 403エラー(閲覧禁止 Forbidden)を発生させて、ページを表示しないようにできます。 複数使いたい場合は、[L,R]などと記載します。

[RewriteRule] の具体的な書き方

.htaccessに以下を記述します。
# リライトエンジンをONに設定
RewriteEngine On
# RewriteRule Pattern Substitution [flags]
RewriteRule some-folder/index.html /alias/new-file-name.html
リライトエンジンをONに設定することで、RewriteRuleが使えるようになります。 Patternのパスを書くときは、現在の階層からの相対パスで記載します。 Substitutionはドメイン以降のパスを書く必要があります。 前方のPatternのところに渡ってくる文字列は、.htaccessが置いてあるところまでのパスは渡ってきません。

[RewriteRule] と[Redirect]の違い

[RewriteRule] はURLは変更されません。 [Redirect]はURLまで変更されます。 [RewriteRule]を使った場合は、クライアント側にリライトを要求するのではなく、Apacheのサーバーの中で擬似的にリダイレクト処理を行うためです。 そのためクライアント側で表示するURLはそのままになります。 このように、Apache内部で行うリダイレクトのことを、internal redirectといいます。 Apache内部で擬似的にリダイレクトされているので、ブラウザの検証ツールのnetworkタブでも確認することはできません。
RewriteRule some-folder/index.html /alias/new-file-name.html [R]
ただし、末尾に[R]と記載した場合は、通常のリダイレクト処理と同じようになります。 この場合は、Redirectと同じように、検証ツールからでも処理の内容を確認することができます。

[RewriteRule] の挙動

RewriteEngine On
RewriteRule some-folder/img01.jpeg /alias/img01.png
上の場合、URLはjpegとなりますが、ダウンロードした場合、pngファイルとなります。 検証ツールのcontent typeで確認することができます。
RewriteEngine On
RewriteRule some-folder/ /alias/another-folder/
上の場合、some-folderにアクセスすると、index.htmlでもsample.htmlでもどのファイルにアクセスしても、another-folderのindex.htmlが常に返されます。

RewriteBaseで簡略化

RewriteEngine On
RewriteBase /alias/
RewriteRule some-folder/ another-folder/
RewriteBaseを使うと、substitutionのところのパスを省略して記述することができます。 複数の共通したパスがある場合はReweiteBaseを使うと効率化できます。

Apache

Posted by devsakaso