ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4155591 サブドメインとmod_rewrite
質問者:optional あるレンタルサーバーで独自ドメインでサイトを運営していますが、以下のようなサブドメインの扱いを実現できる方法を探しています。

使用している独自ドメイン
example.com
構成
/home/user01/​www/index.html
/example/index.php
レンタルサーバーのエイリアス設定で「example.com」または「​www.example.com​」で/example/index.phpを表示するよう設定。

やりたいこと
ブラウザのアドレスバーへ入力 → 実際のURL(飛ばし先)
http://user.example.com/​ → ​http://example.com/index.php?p=user
http://abcd.example.com/​ → ​http://example.com/index.php?p=abcd

サブドメインは事実上クエリーなので、userの場合はとかabcdの場合はといった、事前定義的なものができません。

レンタルサーバーのためバーチャルホストは使えません。htaccessとmod_rewriteは使用可能なため、なんとかこれらで実現できないかと考えています。

これに近いことができるという表記が ​http://www.kawaz.jp/pukiwiki/?mod_rewrite#w1eddb33​ にありましたが、自分の環境で試したところ「サーバーが見つかりません」と表示されうまく動きませんでした。最後の改行とか、そのへんのところは大丈夫です。

詳しい方、教えていただけないでしょうか。よろしくおねがいします。
困り度:
  • すぐに回答を!
質問投稿日時:
08/07/06 15:15
この質問に対する回答は締め切られました。

回答

ANo.5 お使いのはNameベースのバーチャルホストでしょうね。
そうだと仮定すると 結論から言えば 駄目元でレンタルサーバー業者にお願いして
ServerAlias にワイルドカード 設定してもらえないか交渉してください。

httpd.conf をいじれれば以下の様にServerAlias指定でワイルドカード設定すれば出来ます
<VirtualHost *:80>
ServerAdmin hoge@example.com
DocumentRoot /var/​www/example/www
ServerName example.com
ServerAlias example.com *.example.com
#####################   ↑のように *.ドメイン名 ならばどのサブドメインでもOK
http://httpd.apache.org/docs/2.0/ja/vhosts/name-based.html#using
ですが、まさかいじれないですよね?>httpd.conf

たぶん今現在 ServerAlias example.com ​www.example.com​ と固定したホスト名が指定されていると思います
その場合 設定されていない abcd.example.com や user.example.com でアクセスするとwebサーバーのデフォルトのホスト用設定が適用されます。

コマンドプロンプトで
c:\hoge> nslookup example.com するとサーバーのIPアドレスが出てきますが
次に そのIPアドレスで
c:\hoge> nslookup **.**.**.**<=上で出てきたIPアドレス
これで example.com が出ればいいですが ここでも標準のホスト名が出てくるはずです

一応念のため ブラウザで
http://上で調べたIPアドレス/ でアクセスしてみてください。
これも 補足にあるように「○○レンタルサーバーへようこそ!的な画面」に成るはずです。
回答者:umasikajiro
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/07/09 15:59
この回答へのお礼ありがとうございます。

お勧めいただいたように、レンタルサーバー業者にお願いしてServerAliasにワイルドカード設定してもらえないか頼んでみましたが、できないとの回答でした。

なので、残念ですが諦めます。色々と勉強になりました。バーチャルホストの設定を詳しく教えていただいてありがとうございます。後学とさせていただきます。

回答良回答10pt

ANo.4 あわわ 質問をよく読んでいませんでした
>「サーバーが見つかりません」
ですね
nslookupやpingで user.example.com もabcd.example.com も通らないのですね?
ならば #1さんの言われるとおり そもそもwebサーバーに到達していないので
.htaccess だろうが httpd.confだろうが駄目ですが

そのレンタルサーバー業者で独自ドメインの サブドメインは設定できないのですか?
例えば さくらインターネットだと 自社で取得したものは勿論
http://support.sakura.ad.jp/support/manual/rs/setdom_b.shtml​ <=サブドメインを使用するにチェック

他社で取得したドメインでもサブドメイン設定/追加できます
http://support.sakura.ad.jp/support/manual/rs/setdom_c.shtml#dom05
私自身も他社で取得したドメインでネームサーバーを さくら のにしてサブドメインを2つ追加しています。
回答者:umasikajiro
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/07/08 23:15
この回答へのお礼ありがとうございます。

下の方の回答にも書いたのですが、webサーバーに到達すること自体は成功しました。

しかしレンタルサーバー側で、サブドメインを無視して特定のページに誘導したりする機能(catchALL)が無い様です。個別設定では誘導できますが、あらかじめ全て指定する必要があるため、当初の目的であるサブドメインのクエリ化ができません。

>そのレンタルサーバー業者で独自ドメインの サブドメインは設定できないのですか?

登録することはできますが、やりたいことはどんなサブドメインであってもそれをクエリとしてindex.phpに渡して欲しいということなので、あらかじめサブドメインを定義したり設定することができません。
そのためワイルドカードで取ってきてくれることが必須という状況です。

ネームサーバー調整→どんなサブドメインでもとりあえずレンタルサーバーのIPまでは来れるようになった
しかしサーバーのIPだけでは自分の契約ディレクトリを表示できない→○○レンタルサーバーへようこそ!的な画面が出るだけ

やはりレンタルサーバー側がワイルドカード対応していないという時点で、アウトでしょうか?

回答良回答20pt

ANo.3 > ドメイン管理サービスではDNSの設定がほとんど変更できず、NSレコードしか登録できないような感じです。

NSレコードしか登録できない、ということは、裏返せば自分でDNSサーバをたててそれを登録できるということになります。
詳しい状況がわからないので断言はできませんが、ドメインのプライマリDNSサーバを別途用意できるのであれば、そこでワイルドカードのレコードを登録することができるのではないでしょうか?
回答者:Toshi0230
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/07/08 23:06
この回答へのお礼ありがとうございます。

その後色々と調べまして、Value-Domainの無料のネームサーバ機能を使ってワイルドカードのレコードを登録しました。
そのためどんなサブドメインであっても「サーバーが見つかりません」とブラウザに表示されることはなくなりました。

しかしここで新たな問題が生じ、使用しているレンタルサーバーはひとつのIPのマシンに何十もの契約者がいるため、ワイルドカードのサブドメインでこのIPに誘導することには成功したものの、そのIPだけでは自分が管理するディレクトリを表示できません。

DNSサーバ側では、このIPであることに加え、このディレクトリを表示せよ、という指定まではできないでしょうか?

回答

ANo.2 どのサブドメインでアクセスしても /example/index.php は見に行く状態なのですよね?

TOPPAGEだけの事なら簡単にやるなら

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^$ /index.php?%{HTTP_HOST} [L]

これで
http://user.example.com/​ にアクセスするとURLはそのままでindex.php?user.example.com とQueryが渡り
http://abcd.example.com/​ なら同じく index.php?abcd.example.com
です。

>これに近いことができるという表記が
そのサイトを見てみましたが httpd.confのグローバルセクションへの記述法です
.htaccessや Directoryコンテナ内ではマッチしません
http://oshiete1.goo.ne.jp/qa4110860.html

と書いたところで思いましたが、どうせPHPで受けるのなら
index.php内で $_SERVER["HTTP_HOST"] を取得して
それに応じたページを表示すれば Rewriteも不要なのでは?
回答者:umasikajiro
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/07/06 15:55
この回答へのお礼ありがとうございます。

>どのサブドメインでアクセスしても /example/index.php は見に行く状態なのですよね?

残念ながら、これではいけません。下の方への回答で書きましたが、catch all的な機能が無いようです。
他のアイディアとして、カスタマイズ性があるらしいValue-Domainの無料ネームサーバを間に挟んで管理すればcatch allもできるような記述を発見しました。まだ試してないのですが。

これができれば$_SERVER["HTTP_HOST"]からそれに応じたページを表示することも可能ですよね。Rewriteにこだわってるわけではないので、それでできれば問題ないです。

回答

ANo.1 これ、Apache (mod_rewrite)の設定だけでは実現できない操作なんですが、そのあたりは認識されていますでしょうか?

DNSで、ワイルドカードを使用した名前解決を設定していないと、そもそもWebサーバにHTTPプロトコルが届きません。
> 「サーバーが見つかりません」と表示されうまく動きませんでした。
とあるのも、そのあたりに原因があるように思われます。

テスト環境があるのであれば、そのあたりを考慮した上で再度試してみてください。
回答者:Toshi0230
種類:回答
どんな人:経験者
自信:参考意見
回答日時:
08/07/06 15:31
この回答へのお礼ありがとうございます。mod_rewriteだけでは実現できないんですね。

>DNSで、ワイルドカードを使用した名前解決を設定していないと
このへんが非常に疎いんですが、状況から言うとレンタルサーバーでは独自ドメインを使用できますが、事前に設定したもののみで、サブドメインをcatch allで受け入れるような機能はありません。
ドメイン管理サービスではDNSの設定がほとんど変更できず、NSレコードしか登録できないような感じです。

これでは当初の質問を実現できないでしょうか。