【Apache】 [RewriteRule] リライトでURLを書き換える方法と意味を理解する
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を使うと効率化できます。