• ベストアンサー

ServerNamedで正規表現は使えますか?

ServerName www.example.com Redirect permanent / http://example.com/ としてwww.example.comでのアクセスをリダイレクトして今はしのいでいます。 これを ServerName (.*)\.example.com とか正規表現のつもりでやって「どんなマルチドメイン」でアクセスしてきてもhttp://example.com/ に集約しようと思ったのですができません。 どんなマルチドメイン(hoge.example.comとかpoge.example.comとか)でもexample.comのドメインであればhttp://example.com/に集約させたいです。 お分かりになる方いらっしゃいますでしょうか? vine linux 3.2 apache 1.3

質問者が選んだベストアンサー

  • ベストアンサー
  • ky072
  • ベストアンサー率60% (85/140)
回答No.2

> 蛇足ですが、あるいはServerAliasでも301を出せるんですかね? > ServerAlias *.example.com [R=301,NE,L] > とか。方法があればおしえていただけたら幸いです。 残念ながらそういう方法はありません。 ちょっと言葉足らずで分かりづらかったかもしれませんが、 厳密に言うと、#1 で提案した2つの方法はそれぞれ違う次元の話です。 ServerAlias は name-based な VirtualHost を使用している場合に、 特定の VirtualHost に異なるホスト名のリクエストを落とし込むのに使います。 *.example.com が意図した VirtualHost に落ちない、 *.example.com へのリクエストを処理できていないという問題だった場合、 ServerName の代わりに ServerAlias を使用すれば解決します。 http://httpd.apache.org/docs/current/ja/vhosts/name-based.html 一方、*.example.com へのリクエストは正しく処理できているが、 URL を書き換える方法だけがわからないという問題だった場合、 mod_rewrite を使用します。 場合によっては、両方の対応が必要だったりします。 例えば、ServerAlias で *.example.com を指定した VirtualHost 内で、 mod_rewrite を使用するなど。

q0190dg
質問者

お礼

結果的には問題はクリアできましたが若干違う形になってしまいました。 問題のひとつの原因がわかりました。 Virtualhostの一番上に書かれたドメインに飛ばされる仕様だったことを知りませんでした。 結局正規表現はうまくうごきませんでした。なにかが間違っているのでしょう。 原因がつかめませんでしたが、Virtualhostの一番上に書かれたドメインにエラーページを設置することで、他の関係ないVirtualhostに移行していまうことは防げるようになりました。 いろいろありがとうございました!! しかし出来ればどんなvirtualドメインでアクセスしてきても、目的のドメインにRewriteしたいってことは確かです。 また試してみますー

q0190dg
質問者

補足

ありがとうございます。 結果から言うと、試してみましたがうまくいきませんでした。 いただいたものを挿入する際、はてどこにいれたものだろうか、と悩んでしまいました。 試したことは以下です。 /////////////////////////////////////////////// 1.example.comのホストを指定した中に一緒に入れた <Virtualhost 192.168.1.1> ServerName example.com RewriteEngine On # RewriteBase / RewriteCond %{HTTP_HOST} !^(example\.com(:80)?)?$ [NC] RewriteRule ^(.*)$ http://example.com/$1 [R=301,NE,L] </Virtualhost> /////////////////////////////////////////////// 2.example.comのホストを指定した別のものを作った。 <Virtualhost 192.168.1.1> ServerName example.com </Virtualhost> <Virtualhost 192.168.1.1> RewriteEngine On # RewriteBase / RewriteCond %{HTTP_HOST} !^(example\.com(:80)?)?$ [NC] RewriteRule ^(.*)$ http://example.com/$1 [R=301,NE,L] </Virtualhost> /////////////////////////////////////////////// ※コピペしたわけではないので誤字があるかもしれません。ご免ください。 双方適当なバーチャルドメインでアクセスしたときにDocumentRootにリダイレクトされてしまいます。 またRewriteBase / があるとapacheが再起動に失敗します。なのでコメントアウトしておきました。 もろもろ原因かヒントなどお分かりになりますでしょうか? AliasとRewriteとの違いを私なりに理解しました。 ご解説ありがとうございます。

その他の回答 (1)

  • ky072
  • ベストアンサー率60% (85/140)
回答No.1

同一サーバで example.com 以外のドメインも共存していて、 name-based な VirtualHost を利用しているのでしょうか。 そうでしたら、ServerName の代わりに ServerAlias ディレクティブを使用するのも良いです。 ServerName と異なり、ServerAlias ではワイルドカード(正規表現ではない)が使えます。 http://httpd.apache.org/docs/current/mod/core.html#serveralias また、mod_rewrite でも対応可能です。 RewriteBase / RewriteCond %{HTTP_HOST} !^(example\.com(:80)?)?$ [NC] RewriteRule ^(.*)$ http://example.com/$1 [R=301,NE,L] http://httpd.apache.org/docs/current/mod/mod_rewrite.html

q0190dg
質問者

補足

なるほどわかりやすい解説ありがとうございます!! SEOなども考えると301リダイレクトできるmod_rewriteの方がいいですね。 はあ、こうやって書くんだあ。 教えて頂いたページにも訪れていたんですがよくわかりませんでした。 さっそく試してみたいと思います。 蛇足ですが、あるいはServerAliasでも301を出せるんですかね? ServerAlias *.example.com [R=301,NE,L] とか。方法があればおしえていただけたら幸いです。 取り急ぎお礼申し上げます。