質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Q&A

解決済

1回答

983閲覧

Apacheにおける、.htaccessに記載するRewriteRule設定で、1台のApacheで複数台のドメインを演じ分けたい

Natsuki902

総合スコア13

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

0グッド

0クリップ

投稿2020/02/17 16:09

編集2020/02/17 21:10

前提・実現したいこと

開発環境で、外部のWebサイト(CRL配布ポイント)に接続できないため、その代替を行うWebサーバを内部に構築しました。
しかし、その外部Webサイトが何種類かあるため、1台のApacheに演じ分けさせたいと考えています。

1 http://192.168.1.2/ → htdocs/index.html (試験用Webサイト)
2 http://crl1.hogehoge.com/test.html → htdocs/crl1/test.crl (CRL配布ポイント1の代替)
3 http://crl2.hogehoge.com/test.html → htdocs/crl2/test.crl (CRL配布ポイント2の代替)

※負荷面では、1のURLへの接続がメインで、2や3はGETリクエストが時折、という程度なので、1台のサーバに
まとめるのは問題ありません。

発生している問題・エラーメッセージ

パターン1 2のURLに接続しているのに、1のURLが表示される(1の場所に、該当するファイルがない場合、HTTP404)
パターン2 HTTP 500出力

該当のソースコード

■htdocs/.htaccess(パターン1時)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^crl1.hogehoge.com
RewriteRule /[^/]* cert/$1 [L]
RewriteCond %{HTTP_HOST} ^crl2.hogehoge.com
RewriteRule /[^/]* cert2/$1 [L]

■htdocs/.htaccess(パターン2時)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^crl1.hogehoge.com
RewriteRule ^(.)$ crl1/$1 [L]
RewriteCond %{HTTP_HOST} ^crl2.hogehoge.com
RewriteRule ^(.
)$ crl2/$1 [L]

試したこと

上記のように、.htaccessファイルを色々書き換えているのですが、
「/test.html」のみにマッチして、「/crl1/test.html」にマッチしない正規表現を作れていません。
※パターン1は、単に”書き換え前のパス”にマッチできていない様子です。
パターン2は、”書き換え後のパスもマッチする”から、無限ループしていました。(error.logにて確認)
→なので、上記要件を満たした正規表現が分かればいいのかなと考えています。

2020/2/18 5:38追記
ネット検索ワードの問題だったのか、お二方からのご指摘にありました、Virtual Hostを使用した方法は存じ上げませんでした。
なお、開発環境の都合により、IPアドレスは「Apacheを導入したノードに割り振られた1個」しか使用できません。
ただし、httpd.confは私の一存で編集可能な状況です。

補足情報(FW/ツールのバージョンなど)

Apache2.4
Windows 10 Pro
フォルダ構成
C:\Apache24/htdocs (ドキュメントルート)
index.html (上記、1のURLのときは、ここを見せたい)
.htaccess (上記で試行錯誤している.htaccessファイル)
crl1/
test.crl (上記、2のURLのときは、ここにあるファイルにリダイレクトさせたい)
crl2/
test.crl (上記、3のURLのときは、ここにあるファイルにリダイレクトさせたい)
※他に必要な情報があれば、ご教示ください。

###ご回答内容を受けて追加で試したこと(2020/2/18 6:00追記)
VirtualHostを使用したやり方について、otnさん、tanatさん(ご回答順)のご指摘を受け、ネット検索をやり直して
確認しました。

■httpd.conf(追記部分)
#マルチドメイン向け設定追加
<Directory "${SRVROOT}/htdocs2">
Options FollowSymlinks Includes
AllowOverride All
AddType text/html .html

# ここを変更
Require all granted
</Directory>

<VirtualHost *:80>
DocumentRoot ${SRVROOT}/htdocs
ServerName myserver1

# Other directives here

</VirtualHost>

<VirtualHost *:80>
DocumentRoot ${SRVROOT}/htdocs2
ServerName myserver2

# Other directives here

</VirtualHost> ※teratailの仕様で”見出し”にならないよう、httpd.confのシャープは全角文字に置き換えています。

フォルダ構成
C:\Apache24
/htdocs (ドキュメントルート1)※IPアドレス指定でアクセスされた場合(通常時)はここへ
index.html
/htdocs2 (ドキュメントルート2)※crl1.hogehoge.comドメイン指定でアクセスされた場合はここへ
同様に、Directoryタグと、VirtualHostタグを必要分セットで追加するイメージが湧いています。

自宅PC(上と同様の設定)でうまく振り分けられることを確認しました。
職場の開発環境(宛先のドメイン名などが異なりますが、やりたいことは同じ)でうまくいくか、出社後に確認します。
確認後、本日夜間~明日未明くらいに確認結果を追記いたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/02/17 17:13

Virtual Hostを知らないのか、Virtual Hostで何か問題があるのか、どちらでしょうか?
Natsuki902

2020/02/17 20:36

早速のご反応、ありがとうございます。 ネット検索ワードの問題だったのか、Virtual Hostのやり方にはたどり着けておりませんでした。 なお、開発環境の都合上、IPアドレスは、構築に使用した端末の実ノードアドレス1個しか使用できません。 ただし、httpd.confについては、私の一存で修正が可能です。
otn

2020/02/17 22:41

> ※teratailの仕様で”見出し”にならないよう、httpd.confのシャープは全角文字に置き換えています。 問題が発生したら、場当たり的に解決せず、正しい方法を調べましょう。
Natsuki902

2020/02/17 23:33

失礼いたしました。 こちら、httpd.confのコメントは半角シャープで記載していて、 処理への無影響を確認していますが、こちらのサイトにコピーすると 「補足情報」などと同じ、見出しとして扱われてしまい、 非常に見づらくなってしまったため、そうならないように 全角シャープで置き換えているものです。 もしかして、質問欄にソースコードを張り付ける手順も 実は専用の手順があったりするのでしょうか。不勉強で申し訳ありません。
Natsuki902

2020/02/18 16:10

ご提示いただきましたリンク先を確認いたしました。 次回以降、サイトのヘルプを参照しつつ、質問させていただきたく思います。 色々とご教示いただき、ありがとうございます。
guest

回答1

0

ベストアンサー

そのような場合、.htaccessでは無く、名前ベースのVirtualHostを使用してドメイン毎にドキュメントルートを設定するのが一般的&簡単です。
(各ドキュメントルートの中の.htaccessでは本番と同様のものが使えます。)

公式 バーチャルホストの例

一つの IP アドレスでいくつかの名前ベースの ウェブサイトを実行する
サーバは IP アドレスを一つ割り当てられていて、DNS でマシンに 複数の名前 (CNAME) が指定されています。このマシンで www.example.comwww.example.org のためのウェブサーバを実行させたいとします。


Apache サーバの設定でバーチャルホストの設定をしただけで、 知らない間にそのホスト名に対応する DNS のエントリが 作成されたりはしません。そのサーバの IP アドレスに解決される ように DNS に名前を登録しなければなりません。 そうでないと誰もあなたのウェブサイトを見ることはできません。 ローカルでのテストのために hosts ファイルに エントリを追加することもできますが、この場合はその hosts エントリのあるマシンからしか動作しません。

httpd.conf

1サーバ設定 2# Ensure that Apache listens on port 80 3Listen 80 4 5# Listen for virtual host requests on all IP addresses 6NameVirtualHost *:80 7 8<VirtualHost *:80> 9DocumentRoot /www/example1 10ServerName www.example.com 11 12# Other directives here 13 14</VirtualHost> 15 16<VirtualHost *:80> 17DocumentRoot /www/example2 18ServerName www.example.org 19 20# Other directives here 21 22</VirtualHost> 23 24

検索キーワードとしては
Apache VirtualHost マルチドメイン辺りで探すと公式以外の情報も集めやすいかと思います。

投稿2020/02/17 17:15

tanat

総合スコア18727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Natsuki902

2020/02/18 16:11

職場の環境においても、ご教示いただきました内容をもって修正し、 想定通りの挙動をさせられることを確認できました。 この度は大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問