[[Apache]]

*目次 [#oda6be8a]
-[[フラグの意味>#o3095730]]
-[[同じドメインの別ディレクトリにあるファイルへのリダイレクト>#n515f123]]
-[[別ドメインのアドレスへリダイレクト処理を実施する。>#ea93fc40]]
-[[別ドメインのアドレスをリダイレクト処理する(AからBへ)>#k30f3905]]
-[[index.phpとindex.htmlのアクセスを統一させる。>#v9afdb9e]]
-[[特定のページのみアクセスを許可する >#a316f59d]]
-[[トップページへのアクセスのみリダイレクト>#ic03f860]]
-[[スマフォサイトへリダイレクトする記述 >#e532b42a]]
-[[あるディレクトリへのアクセスの際に、そのディレクトリの配下の別のディレクトリへリダイレクト>#v3300edf]]
-[[スラッシュの有無の統一>#z1655ef4]]
-[[URLの書き換え www有りへの統一>#m056784a]]
-[[URLの書き換え www無しへ統一>#bd4f1f55]]
-[[特定のディレクトリの配下のみサブドメインを統一する>#ye8206b2]]
-[[Apacheでhttp://*のアクセスを全てhttps://にリダイレクトする方法>#o9344546]]
-[[特定のディレクトリのみhttpsへリダイレクトし、それ以外はhttpでアクセスさせる方法 >#x2072653]]
-[[Pound配下の場合>#s247f548]]
-[[同一ディレクトリ内の別のディレクトリは除外して、当該ディレクトリへのアクセスはリダイレクトする方法>#qa4c6d93]]
***パラメータ関連 [#i30d1422]
-[[CGIなどのGETパラメータを持っているURLを別のパラメータを持つURLへ書き換え>#l92605b3]]
-[[CGIなどのGETパラメータを持っているURLを同じパラメータのURLへ書き換え>#kbf7c008]]

-[[特定のIPアドレスからのアクセスは除外して、それ以外はリダイレクトする。>#k6fa4881]]
-[[例:メンテナンスで社外からはメンテナンスページを表示させて、社内から通常どおりアクセスさせたい場合 >#pbe59f2e]]
-[[存在しない複数URLに対して>#p35bc1d2]]
-[[例2.別のドメインやURLにリダイレクトする>#o61ceea2]]
-[[注意事項>#d2915bbd]]

*備考:2015年11月5日追記 [#ca6a4ef2]
メンテナンスページへのリダイレクトについては、下の方の302リダイレクトは最適ではないようなので、下記を参考に設定するようにしてください。~
理由として302リダイレクトだとリダイレクト先ページは200番のステータスコードが返り、検索順位が落ちる、メンテナンス後に復帰させるのに再度リダイレクトしてあげないといけないなどの問題があるためだそうです。~
詳細はこちら↓~
http://web-tan.forum.impressrd.jp/e/2009/06/16/5880

***メンテナンスページへのリダイレクト [#m95189b2]
Apacheのconfへの記述の仕方です。.htaccessも下記を参考にしつつ書き換えてください
 ### Maintenance
 Alias /maint /var/www/maint
 ErrorDocument 503 /maint/index.html
 Header set Retry-After "Fri, 06 Jun 2015 0:00:00 GMT"
 
 RewriteEngine on
 RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.99$
 RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.100$
 RewriteCond %{REQUEST_URI} !^/maint/index.html
 RewriteRule  ^.*$ /maint/index.html [R=503,L]

*フラグの意味 [#o3095730]
| NC |大文字小文字を無視|
|L |変換打ち切り(確定)|
|R| リダイレクト|
|R=301|ドメインの永久移転 ※永久的にリダイレクトさせる場合に使用する。しないとSEOで評価が下がる場合がある|
|R=302|ドメインの一時移転 ※一時的にリダイレクトさせる場合に使用する。しないとSEOで評価が下がる場合がある|
|NE |エスケープしない|
|OR|OR条件。記述なしでデフォルトAND条件|
~

*同じドメインの別ディレクトリにあるファイルへのリダイレクト [#n515f123]
Apacheにて「mod_rewrite」が読み込まれている場合は、Rewriteモジュールにてリダイレクト処理が可能です。~
下記記述をhttpd.confに追記してください。
 RewriteEngine on
 RewriteCond %{REQUEST_URI} !^/user_data/maintenance.php$ [NC]
 RewriteCond %{REQUEST_URI} !^/user_data/img/maintenance/header.jpg$ [NC]
 RewriteRule  ^.*$ /user_data/maintenance.php [R,L]
 
 ※RewriteCondにて、リダイレクト処理を除外しています。
  最後に[NC]を記述することで、次のルールに処理を渡しています。
~
*別ドメインのアドレスへリダイレクト処理を実施する。 [#ea93fc40]
httpd.confのDocumentrootの下に以下を追記してください。~
 <Directory />
     Redirect / http://hogehoge.com
 </Directory>
 
 ※「/」がDocumentRoot配下を意味しています。

*別ドメインのアドレスをリダイレクト処理する(AからBへ) [#k30f3905]
 RewriteEngine On
 RewriteCond %{HTTP_HOST} ^www\.hogehoge\.net [NC]
 RewriteRule ^(.*)$ http://www.hogehoge.jp/$1 [R=301,L]

*index.phpとindex.htmlのアクセスを統一させる。 [#v9afdb9e]
例えばトップページで使用していないindex.htmlをindex.phpにリダイレクトさせたい場合、DirectoryIndexにIndex.phpを追加しておき、Apacheのconfファイルに下記を追記することでトップのindex.phpへ統一させることができます。~
別の拡張子も同様です。
 ### Redirect
 RewriteEngine On
 RewriteRule ^/index.html$ http://%{HTTP_HOST} [R=301,L]


*特定のページのみアクセスを許可する [#a316f59d]
特定のページのみアクセスを許可する場合で、他ページはリダイレクト処理を実施したい場合は、下記設定にて特定のディレクトリ配下にあるファイルからの処理はすべてリダイレクトを無視する設定をしてください。~

 RewriteCond %{HTTP_REFERER} !^http://(www\.)?hoge\.com/admin/*.*$ [NC]
 RewriteCond %{REQUEST_URI} !^/admin/*.*$ [NC]
 
上記例では、/admin/配下のページへのアクセスを許可する設定にしています。~
/admin以外のページにアクセスした場合は全てリダイレクト処理されます。~
しかしながら、/adminの直下にあるindex.phpおよびlogin.phpではリダイレクト対象の画像やjsファイルがパスに含まれていました。~
httprefererを使用することで、当該ディレクトリ配下のリダイレクト処理を無視することができます。

*トップページへのアクセスのみリダイレクト [#ic03f860]
 RewriteEngine On
 RewriteRule ^/$ http://inamuu.com/ [R=301,L]
トップページへのアクセスのみをリダイレクトさせて、その配下のページについては、アクセスさせたい場合は上記記述でOKです。
~
*スマフォサイトへリダイレクトする記述 [#e532b42a]
 RewriteEngine On
 RewriteCond %{Request_URI} !^/live/mobile/(.*)$ [NC]
 RewriteCond %{HTTP_USER_AGENT}  (iPhone|iPod|iPad|Android|BlackBerry|Windows.Phone) [NC]
 RewriteRule ^/live/(.*)$ /live/mobile/$1 [R,L]
~
*あるディレクトリへのアクセスの際に、そのディレクトリの配下の別のディレクトリへリダイレクト [#v3300edf]
 hoge配下に複数ファイルがあって、アクセスURLが/hoge/2013という場合。
 RewriteCond の!エクスクラメーションマークにて除外している。
 
 RewriteEngine On
 RewriteCond %{REQUEST_URI} !/hoge/.+ [NC]
 RewriteRule ^/hoge /hoge/2013/ [R=301,L]
~
*スラッシュの有無の統一 [#z1655ef4]
 RewriteEngine On
 RewriteRule ^/hoge/2013$ /hoge/2013/ [R=301,L]

*URLの書き換え www有りへの統一 [#m056784a]
 RewriteEngine on
 RewriteCond %{HTTP_HOST} ^example\.com$
 RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

*URLの書き換え www無しへ統一 [#bd4f1f55]
 RewriteEngine On
 RewriteCond %{HTTP_HOST} ^www\.hogehoge\.com
 RewriteRule ^(.*) http://hogehoge.com$1 [R=301,L]
 
 ※R=301は301リダイレクトと呼ばれ、永久移転を表す。

*特定のディレクトリの配下のみサブドメインを統一する [#ye8206b2]
 RewriteEngine On
 RewriteCond %{HTTP_HOST} ^inamuu\.com
 RewriteCond %{REQUEST_URI} ^/testdir/
 RewriteRule ^(.*) http://www.inamuu.com$1 [R=301,L]
~

*Apacheでhttp://*のアクセスを全てhttps://にリダイレクトする方法 [#o9344546]
 # vi /etc/httpd/conf.d/rewrite.conf
 RewriteEngine On
 RewriteCond %{SERVER_PORT} !^443$
 RewriteRule ^/(.*)?$ https://%{HTTP_HOST}/$1 [L,R]

*特定のディレクトリのみhttpsへリダイレクトし、それ以外はhttpでアクセスさせる方法 [#x2072653]
 ### httpd.confに記述(80番)80番でhogeにきたらhttpsへリダイレクトする
 RewriteEngine On
 RewriteCond %{SERVER_PORT} !^443$
 RewriteCond %{REQUEST_URI} ^/hoge/.*$
 RewriteRule /.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
 
 ### ssl.confに記述(443番)443番でhoge以外にきたらhttpにリダイレクトする
 RewriteEngine On
 RewriteCond %{SERVER_PORT} ^443$
 RewriteCond %{REQUEST_URI} !^/hoge/
 RewriteRule /.*$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
 
***Pound配下の場合 [#s247f548]
 RewriteEngine On
 RewriteCond %{HTTP:X-Forwarded-Proto} =http
 RewriteRule ^/(.*)?$ https://%{HTTP_HOST}/$1 [L,R]
 ※条件としてPoundからヘッダーにhttpという情報が付与されている必要がある
-[[Pound配下のサーバーへの接続をすべてSSLリダイレクトする設定]] を参照

*同一ディレクトリ内の別のディレクトリは除外して、当該ディレクトリへのアクセスはリダイレクトする方法 [#qa4c6d93]
例えば、http://inamuu.com/test01/ から /top/へリダイレクトしたいけど、
/test01/配下のディレクトリは無視させたい場合は、下記の通りに記述すればOK。
 RewriteEngine On
 RewriteCond %{REQUEST_URI} !^/test01/(.+)$ [NC]
 RewriteRule ^/test01/(.*)$ /top/ [R,L]
 
 「+」をつけることで1文字以上存在すればリダイレクトする。

*パラメータ関連 [#v517ca6d]
-通常、パラメータは無視されるので、query_stringオプションで指定する

***PHPパラメータを持つURLへアクセスがあったらリダイレクト [#r0efa353]
 RewriteEngine On
 RewriteCond %{QUERY_STRING} it_id=1393347333
 RewriteRule ^/item.php http://inamuu.com/yoyaku/index.php? [R=301,L]

~
''備考''
query_stringでパラメータを指定すると、リダイレクト後もパラメータを引き継ぐため、リダイレクト後はパラメータを削除したい場合はリダイレクト後のURLの末尾に「?」を追記することで、パラメータ付きURLへのリクエストをパラメータ無しへのURLへリダイレクト可能

参考URL:http://d.hatena.ne.jp/shimooka/20070328/1175047714

***CGIなどのGETパラメータを持っているURLを別のパラメータを持つURLへ書き換え [#l92605b3]
 RewriteEngine On
 RewriteCond %{QUERY_STRING} c=list&category_b_pk=1$
 RewriteRule ^/cgi-bin/index.cgi products/list.php?category_id=8 [R=301,L]


***CGIなどのGETパラメータを持っているURLを同じパラメータのURLへ書き換え [#kbf7c008]
 RewriteEngine On
 RewriteCond %{QUERY_STRING} c=list&category_b_pk=1$
 RewriteRule ^/cgi-bin/index.cgi products/list.php? [R=301,L]
 
 ?をURLの末尾に付与すると、元のGETパラメータをそのまま持つ


*特定のIPアドレスからのアクセスは除外して、それ以外はリダイレクトする。 [#k6fa4881]
 RewriteEngine On
 RewriteCond %{REMOTE_ADDR} !^192\.168\.0\.1$ 
 RewriteCond %{REMOTE_ADDR} !^192\.168\.0\.2$
 RewriteRule ^index.html /mainte.html [R=302,L]
 
 外部にはメンテナンス画面を表示させて、社内には通常どおりアクセスさせたい場合に使用可能。

~
~ 
***例:メンテナンスで社外からはメンテナンスページを表示させて、社内から通常どおりアクセスさせたい場合 [#pbe59f2e]
 DocumentRootが/var/www/html
 メンテナンス用のディレクトリが/var/www/maintenance
 メンテナンス用のファイルがindex.htmlとlogo.gifで上記ディレクトリ内にあるとする
 
 下記の記述をApacheのconfファイルに記述する ※数字の所をリダイレクトさせたくない接続元のIPアドレスに変更する
 ### Maintenance
 Alias /maintenance /var/www/html/maintenance
 
 RewriteEngine On
 RewriteCond %{REQUEST_URI} !^/maintenance/(.*)$ [NC]
 RewriteCond %{REMOTE_ADDR} !123\.456\.789\.101$
 RewriteCond %{REMOTE_ADDR} !102\.103\.104\.105$
 RewriteRule ^/(.*)$ /maintenance/index.html [R=302,L]


*存在しない複数URLに対して [#p35bc1d2]
サーバー移行等でURLが代わり、リンク切れをさせないための対策です。下記のように連続して記述可能です。
***例1.同じURLへリダイレクトする [#j08aaa2e]
 RewriteEngine On
 RewriteCond ${REQUEST_URI} ^/about [OR]
 RewriteCond $REQUEST_URI} ^/news [OR]
 RewriteRule ^/(.*)$ http://www.inamuu.com/ [R=301,L]

***例2.別のドメインやURLにリダイレクトする [#o61ceea2]
 RewriteEngine On
 RewriteRule ^/news http://www.inamuu.com/ [R=301,L]
 RewriteRule ^/about http://www.inamuu.com/test/ [R=301,L]
 RewriteRule ^/locate http://test.inamuu.com/locate/ [R=301,L]

*注意事項 [#d2915bbd]
VirtualhostやSSLを使用した場合は、それぞれのコンフィグファイルに記述を行う。

*参考書籍 [#h8beebe3]
[[Apache実践運用>http://www.amazon.co.jp/gp/product/4774150363/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4774150363&linkCode=as2&tag=kamz-22]]



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS