[Apache] 最新版のインストール, mod_rewrite その1

意外に知らないことが多かったので、適当に調べてメモしておく。
.htaccessではなく、confファイルへの記述であることに注意。
なお、本環境は CentOS 6.4をminimalインストールし、ネットワーク設定完了後から始めている。


Apacheのインストール


デフォルトのApacheは 2.2.15 なので、 2.2系の最新をインストールする。
コンパイルとかして、rpm作ってもいいけど、動作実績がある、外部リポジトリの追加のほうが楽なので
そちらで対応


CentALTリポジトリの追加


epel に依存しているようなので、epel, CentALTをインストールする


yum install wget
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
wget http://centos.alt.ru/repository/centos/6/x86_64/centalt-release-6-1.noarch.rpm
rpm -ivh centalt-release-6-1.noarch.rpm

なお、最新のcentalt-release-6-*.noarch.rpmはここより探す


それぞれ、enabled=1になっているので、enabled=0にする


sed -ie "s/enabled=1/enabled=0/g" /etc/yum.repos.d/epel.repo
sed -ie "s/enabled=1/enabled=0/g" /etc/yum.repos.d/centalt.repo

Apacheのインストール


enablerepo=CentALTとしてインストール


yum install httpd --enablerepo=CentALT

Apacheの設定


今回は検証用なので、デフォルトをベースに適当に設定。


cd /etc/httpd/conf/
mv httpd.conf httpd.conf.org
wget -O httpd.conf http://namakesugi.web.fc2.com/httpd.conf.txt
cd ../conf.d
mkdir org
mv *.conf org/
mv README org/
cd /var/www
mkdir org
mv cgi-bin/ org/
mv error/ org/
mv icons/ org

検証用のファイルの設置


mkdir -p /var/www/dummy
echo "dummy" > /var/www/dummy/index.html
echo "example.com" > /var/www/html/index.html

wwwへのリライト


基本的な使い方で、wwwなしをwwwありへリライトする場合


vi /etc/httpd/conf.d/httpd-vhosts.conf

NameVirtualhost *:80

<VirtualHost *:80>
ServerName dummy.example.com
DocumentRoot /var/www/dummy
</VirtualHost>

<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/html

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule (.*) http://www.example.com$1 [R=301,L]
</VirtualHost>

wwwありへのリダイレクトの説明


RewriteCondで RewriteRuleを適用するための条件を指定している。
この場合は, HTTP_HOSTが example.comで始まる場合は、その下のRewriteRuleを適用するという意味となる。


RewriteRuleは (.*)にマッチするリクエストであれば、(ようするに全部のリクエスト)は
www.example.com$1へ301リダイレクトさせるという意味。
つまり、http://example.com/foo/bar へのアクセスは、 http://www.example.com/foo/barへ301リダイレクトされる。


ここで、$1 には `/foo/bar` が設定される。
最後の `R=301`は 301リダイレクトを意味する。


なお、301リダイレクトの場合は、
Google等のインデックスにexample.comのドメインの掲載されなくなり、www.example.comのドメインのみとなる。

ここを`R=302`とすると302リダイレクトとなり、インデックスの中身はwww.example.comだが、URLのドメイン自体はexample.comで掲載される。


メンテナンス表示用のリライト


ここを参考にしている。


example.comへアクセスされた際に、メンテナンス表示をするリライトルールの書き方。
なお、このように書いておくと、Google等がクロールしてきても、インデックスされなくなり、安全。
※もし、200レスポンスでメンテナンス表示を返却してしまった場合は、メンテナンス表示の内容がインデックスされてしまい、掲載順位とか色々おかしくなる。


cat "maintenance" > /var/www/html/maintenance.html

vi /etc/httpd/conf.d/httpd-vhosts.conf

<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/html
ErrorDocument 503 /maintenance.html

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule (.*) http://www.example.com$1 [R=301,L]

RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule ^ - [R=503,L]
</VirtualHost>

なお、引用元では、IPアドレスベースで指定されたIPアドレスからのアクセスの場合はメンテナンス画面を表示しないようにしていたりする。


リクエスト先のURIがが /maintenance.html でなければ、503リダイレクトをする
という意味となる。
ここで、ErrorDocument 503 /maintenance.html と指定してあるため、
Apacheがすべてのリクエストのレスポンスとして /var/www/html/maintenance.html を返すようになる。


curlを使うと以下の様なレスポンスとなる。


curl -v http://www.example.com/
< HTTP/1.1 503 Service Temporarily Unavailable
< Date: Sat, 04 May 2013 17:37:34 GMT
< Server: Apache
< X-Frame-Options: SAMEORIGIN
< Last-Modified: Sat, 04 May 2013 17:21:22 GMT
< Accept-Ranges: bytes
< Content-Length: 12
< Connection: close
< Content-Type: text/html; charset=UTF-8
<
maintenance

RewriteRuleの`Lオプション`について


wwwあり、なしの統一及びメンテナンス表示用のリライトの記述の仕方を試したが、
以下のようにした場合と、もとの場合でどう違うのかを調べてみる。


  RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule (.*) http://www.example.com$1 [R=301] # Lオプションを除去

RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule ^ - [R=503,L]

curlを使ってLオプションのあり、なしにおけるLocaitionヘッダーの中身は以下のようになる。


# Lオプションありの場合
curl -v http://example.com
> HTTP/1.1 301 Moved Permanently
> Location: http://www.example.com/

# Lオプション無しの場合
> HTTP/1.1 301 Moved Permanently
> Location: http://www.example.com/maintenance.html

どちらも301リダイレクトとなっているが、リダイレクト先が Lオプション無しの場合は
http://www.example.com/maintenance.htmlとなってしまっている。


次回はより複雑な設定について

スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。