よる転送設定(リダイレクト)を設定する方法に関してです。よるマニュアルを元に、まとめ直しました。?「.htaccess(エイチティーティーアクセス)」とは、Apache(アパッチ)と呼ばれるWebサーバーにおける、ディレクトリごとに個別設定を行うためのファイルです。配置して、そこに転送処理を書き込みこむ事が一般的です。書き込み権限がないケースがほとんどです。頻繁にメインの設定ファイルを変更して、記述ミスによりエラーを起こして、サーバー全体を止めてしまうリスクを避けたい場合もあると思います。そのような場合のために、「.htaccess」という設定ファイルが便利になります。記載された設定内容は、そのディレクトリとその配下のサブディレクトリに対するアクセスに対してのみ適応されますので、それ以外のディレクトリに影響を与えずに、リダイレクトなどの設定を行える、というわけです。Webサーバーは、Webサーバーとしては非常に多くのシェアを有しています。サーバーが利用されていたのですが、近年はサーバー動作の高速化の目的で「Nginx(エンジンエックス)」と呼ばれる別のサーバーへの移行も多くなっています。継続して設定ファイルとして利用できるようサポートされているようです。利用者としては、サーバーの種類を気にしなくて良いので、安心ですね。対してリダイレクト処理を記述する前提で進んで行きます。いう名前のファイルを作成して、所望のディレクトリ(多くの場合、Webサイトのルートディレクトリ)に配置すればOKです。レンタルサーバー上での配置であれば、FTPなどが利用できるでしょう。1点だけ注意が必要なのが「改行コード」です。改行コードとして「LF(ラインフィード)」のみを認識します。編集したファイルが「CR(キャリッジリターン)」を改行コードとして含む場合がありますので、改行コードを変更できるテキストエディタを利用するようにしましょう。利用する場合は、こちらに改行コードについてまとめています。Vimで改行コードを置換する方法、まとめ。編集できる場合も多いですので、管理パネル内を探してみてください。管理パネル上にテキストエディタが用意されていることもありますので、その場合は改行コードは心配しなくても良いでしょう。リダイレクトの種類「内部転送」と「外部転送」はじめの予備知識として、下記の2つのリダイレクトの種類を区別しておきましょう。外部転送:アクセスを異なるドメインやURLパスに転送する。内部転送:URLはそのままで、内部的に異なるディレクトリを割り当てる。Forwarding)と呼ばれ、リクエストのURLを書き換えて、別のディレクトリや、完全に別のサイトに転送します。Forwarding)と呼ばれ、サーバー内で内部的にディレクトリの割当を変更する設定です。内部転送では、サーバーで内部的に割当が変更されるだけですので、ブラウザのアドレスバーのURLが書き換わることはありません。リダイレクトを書き込む場合では、下記の条件の満たす場合は外部転送、そうでない場合はディレクトリの内部転送となります。利用したリダイレクト設定の場合です)「外部転送」となる条件リダイレクト設定の行末に、転送フラグ([R])を記述している。リダイレクト先の指定が、「http://」などのプロトコルで開始するURL、すなわち、外部サイトが指定されているなお、外部のWebサイト(URLが異なる)への転送は、アドレスバーのURLを変更せずに転送することできません。)特定の意図がない場合は、通常のリダイレクトでは、外部転送することが多いと思うよ。フラグを書き忘れなければ、問題ないね。使ったリダイレクト設定について詳しく見ていきましょう。サンプルをもとに、設定項目の詳細仕様を解説していきます。ドメインが指すディレクトリのルートに配置された「img」ディレクトリ内へのアクセスで、画像ファイルのみを新しい「new-img」ディレクトリに転送します。[R=301,L]</IfModule>設定項目を詳しく見ていきます。mod_rewrite.c></IfModule>という設定で囲む事で、文字通りですが、使っているWebサーバー上で「mod_rewrite」というモジュールが利用可能な場合のみ、このタグ内の設定値を読み込むようにできます。レンタルサーバーであっても、おそらくほとんどのWebサーバーで利用可能なはずですが、まれに利用できない環境がありますので、注意して下さい。モジュールを利用する際に記載します。「On」と記載しましょう。仕様が混乱しやすい設定の一つです。URLのベースディレクトリ」を設定します。配置されたディレクトリ自体となります。/htaccess-test/」と記載(*1)すれば、RewriteRuleでリダイレクト先に「index.php(最初のスラッシュがない事に注意して下さい)」が指定されれば、「/htaccess-test/index.php」が適応されます。slash)は書き忘れても自動的に補完されます。値が利用されるのは「RewriteRule」に指定されたリダイレクト先URLが相対パスで開始する場合のみです。値は使われる事がありません。関係はなんだか紛らわしい・・・。適応する条件を記載します。特有の変数から得られる文字列を対象とし、正規表現やアパッチ特有の条件記号を用いて、マッチングを行います。利用するサーバー変数サーバー変数は「%{変数名}」として参照します。取得できる値HTTP_HOSTホスト名、すなわちドメイン。(例:www.example.com)REMOTE_ADDRホストのIPアドレス。REQUEST_URIリクエストにおけるURI、すなわち、ファイルパス。「/index.php」のように、最初にスラッシュが含まれる点に注意する。クエリ文字列は含まれないREQUEST_FILENAMEファイルシステム上のファイルパス。HTTPSもしリクエストプロトコルが「https」であれば"ON"、そうでなければ"OFF"。「REQUEST_URI」は注意が必要です。クエリ文字列を含みません。使って参照することになります。利用できる条件記号の一部で、最もよく利用するものです。共に使うことがおおいでしょう。意味-d対象文字列をパスとみなし、その存在とディレクトリかどうかをテストする。-f対象文字列をパスとみなし、その存在とファイルかどうかをテストする。-F対象文字列をパスとみなし、そのファイルが存在し、サーバーシステムからアクセス可能な状態かどうか。(副次的なリクエストによりチェックするため、パフォーマンスへの影響がある点に注意)-s対象文字列をパスとみなし、そのファイルが存在し、ファイルサイズがゼロ以上かどうか。複数の条件を連続記載することもできます。デフォルトでは条件は論理和(AND)で制限が強まってしまいますが、RewriteCondの末尾に[OR]フラグを記載することで、(OR)条件を記載することができます。条件の冒頭に「!」マークをつけることで、条件の真偽を逆転することができます。これは便利なので利用する機会が多いと思います。設定行が現れれば、それまでの条件の蓄積は一度クリアされます。mod_rewirteRewriteRuleさて、こちらが実際のリダイレクト処理を設定する設定です。サンプルの「^img/(.*)$」などは、いわゆる正規表現によるパターンの記述が必要なのですが、「正規表現?よくわからない、詳しく知りたい!」という方は、こちらの記事をご一読下さい。置いてあるディレクトリまでのパス(最後のスラッシュまで)切り取ったもの」と定義されています。内で設定する場合では仕様が異なります。配置してあれば、マッチング対象は「img/profile.jpg」となります。定義が異なりますので、注意が必要です。リダイレクト先の指定リダイレクト先の指定では、リダイレクト先となるURL文字列を記載します。設定値をパスとして利用できます。設定行が存在しなかったり、その値を使いたくなければ、リダイレクト先の指定を「/xxx,jpg」などとスラッシュで書き始めればOKです。設定行に追加できるオプションで、これにより実際にリダイレクトが発生します。基本的には、[R=301]、[R=302]のどちらかを設定します。)これら2種類の数字の違いは、下記のようなものです。301:恒久的なリダイレクト。検索エンジンが引っ越しと認識する302:一次的なリダイレクト。検索エンジンが(すぐには)引っ越しと認識しないこれらの数字はHTTPステータスコードと呼ばれ、「アクセスされたWebページの状態」を発信する大切な情報です。こちらの記事に詳しいHTTPステータスコードの解説のセクションがありますので、ご一読下さい。マッチした場合、次の行に進むことまずに、その時点で処理を停止します。設定がまた記載されていれば、せっかくマッチしたリダイレクト先のURLが再度書き換えれてしまいます。行末に記述することになるはずです。あって、結構難しいね・・・。仕様を意識しながら書いたほうが、正しいリダイレクトを実現する近道かもしれないね。設定のサンプルを見ていきます。利用できる事をご確認下さい。ドメインのみ変更)Webサイトへのアクセスを、別のWebサイトへ(=新しいドメイン)に変更します。リダイレクト先URLの「$1」が、マッチした文字列を再利用している事に留意して下さい。設定行でキャプチャされる文字列は、URLパスのスラッシュの後の部分ですので、ご注意くださいね。行の末尾の[R=301]により、HTTPステータスコードを指定しています。Moved)シグナルを送ることは、SEO観点で重要です。こちらの記事にHTTPステータスコードについて詳しく言及しています。PHPの「正しい」リダイレクト方法と、HTTPステータスコードまた、サイトの引っ越しではサイト内のすべての(もしくは、主要な)ページを、すべて新しいドメイン配下の対応する個々のページに転送する事が推奨されています。することで、検索エンジンによるページの評価を新しいドメインに引き継ぐ事ができるのです。別のWebサイトへリダイレクトする(すべて同じページに転送)すべてのアクセスを、任意のページに転送します。下記は新しいドメインのトップページに誘導しています。[R=301,L]</IfModule>ちなみにSEO観点ですが、、「Webサイトの引っ越し」においては、単一ページへのリダイレクトでは、過去のページがもっていた評価を引き継ぐことができません。対応するページがある場合は、できる限り先述のページごとの個別転送を行うと良いでしょう。有/無の統一するドメインについている「www」の有・無を統一します。いう設定項目を追加していることに注意して下さい。内での処理が無限ループに陥るの防いでいます。処理を通されることを意識しながら、設定を書き込む必要があります。[R=301,L]</IfModule>SEO観点では、このような明示的なリダイレクト設定が行われている場合、検索エンジンは、転送先のURLを検索結果に優先的に表示するようになります。このように複数のドメインでアクセス可能なWebサイトのURLを統一することを、「URLの正規化」と呼びます。サブドメインURLを、サブディレクトリURLにリダイレクトするサブディレクトリ型のURLへの変更例です。下記の例は、「sub.example.com」を「example.com/sub」へ転送しています。このようなWebサイトの引っ越しを行うこともあるでしょう。[R=301,L]</IfModule>サブディレクトリは、サブドメインよりもSEO上で有利だと言われいてます。検索エンジンは、サブドメインは、主ドメインとは完全に別のWebサイトとして扱います。属性の近いコンテンツであれば、別々のサイトに分散させるよりも、1つの同じドメインの下に束ねたほうが、主ドメインの評価の向上につながります。開始するURL)に統一します。値が入っていないサーバー環境もありますので、注意して下さい。さくらレンタルサーバーは過去にそのような振る舞いで、ハマる人が続出した時期がありまたが、現在(2018年4月)サーバー仕様の変更により解決しているようです。サーバー変数「%{REQUEST_URI}」と一致しますので、どちらでも構いません。ファイル単位でリダイレクトする特定のファイルへのアクセスを、別のファイルへの転送します。[R=301,L]</IfModule>前述の通り、.htaccess上では、リダイレクト元のパターン指定は、ホスト名直後のスラッシュを含まないURLパス、逆に、リダイレクト先はホスト名直後のスラッシュを含むパスとなります。仕様で定義されていますが、混乱しやすいため、注意が必要です。ディレクト内で、拡張子が「.jpg」か「.png」の場合だけリダイレクトします。RewriteCondで、拡張子を条件に、直後のRewriteRuleが適応されます。そのまま)ブラウザーのURLの変更すること無く、内部的にディレクトリ割り当てを変更します。Forwarding)と呼ばれます。いわゆるリダイレクトとな異なる処理となりますので、注意して下さい。ディレクトリへ割り振る処理です。http・・など外部サイト指定ではない、という条件でした。ディレクトリを外部転送こちらは、ブラウザーのURLが変更する、いわゆるリダイレクトです。オプションが設定されていることに注意して下さい。