【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