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

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

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

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

2908閲覧

サブドメインに対するリライト

cp_cop

総合スコア40

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2017/06/01 06:23

編集2017/06/01 11:19

レンタルサーバーでサブドメインhttp://sub.example.jpを設定しました。

サブドメインの公開フォルダをトップルートに指定したのでサブドメインにアクセスするとhttp://example.jpと同じページが表示されます。

サブドメインにアクセスされた時に、アドレスはそのままの状態でサブドメインをパラメータの値に入れたページを表示させたいです。

イメージとしては以下の通りです。
左のサブドメイン型のURLにアクセスすると、アドレスがそのまま変わらず右のページを表示されるということです。
http://sub.example.jphttp://example.jp/data?mode=sub
http://apple.example.jphttp://example.jp/data?mode=apple
http://flower.example.jphttp://example.jp/data?mode=flower

.htaccessでリライトさせるために以下の.haccessファイルをトップルートに設置したのですが、Internal Server Errorになってしまいます。

RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^(.*)$ /data?mode=$1 [L]

そこで、一旦サブドメインをsubのみと仮定して.htaccessを

RewriteCond %{HTTP_HOST} ^sub\.example\.jp$ RewriteRule ^$ /data?mode=sub [L] ```としてhttp://sub.example.jpにアクセスするとアドレスはそのまま(http://sub.example.jpのまま)で http://example.jp/data?mode=subのページを表示させることができたのですが、 サブドメイン部分が変わる場合の.htaccessの記述がわかりません。 どのように記述すればよいのでしょうか? よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

shi_ue さんの回答にもありますが、RewriteCond のパターンマッチを参照するのは %1%9 です。

(Apache httpd-2.4 の場合) RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^(.*)$ /data?mode=%1 [END]

ループさせないよう、[END] フラグを使っています。
Apache httpd-2.4 の場合、[L] フラグでもループを判定して 2回目で終了してくれるようです。
→(2017/06/02) 訂正:ループするようです。

Apache httpd-2.2 の .htaccess の場合、[END] フラグが使えません。
[L] フラグでも、書き換え後のパスに対して再度先頭のルールから処理され、ループしてしまいます。
URL を変えないとなると、リダイレクトは使えないので、プロキシを使うしかないかもしれません。

(Apache httpd-2.2 の場合) RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^(.*)$ http://example.jp/data?mode=%1 [L,P]

ところで、http://sub.example.jp/ のトップページは良いとして、その下のパスの扱いはどうしたいのでしょうか?


(2017/06/02 01:05) 追記

http://sub.example.jp/123http://example.jp/data?mode=sub&id=123」とのこと、RewriteRule に以下のように「&id=$1」を追加すればいいと思います。

RewriteRule ^(.*)$ /data?mode=%1&id=$1 [END]

投稿2017/06/01 13:23

編集2017/06/02 04:40
TaichiYanagiya

総合スコア12146

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

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

cp_cop

2017/06/01 15:42

ご回答ありがとうございます。 教えていただいたApache httpd-2.4、Apache httpd-2.2ともにトップページが表示されてしまいました。 >その下のパスの扱いはどうしたいのでしょうか? 例えばhttp://sub.example.jp/123とアクセスされた場合には http://example.jp/data?mode=sun&id=123 を表示できるようにしたいと思っています。
cp_cop

2017/06/02 00:48

すいません。 ブラウザのキャッシュの影響か、先のコメントに誤りがありました。 最初に教えていただい記述ですと トップページが表示されるのではなくInternal Server Errorになってしまいます。 RewriteRule ^(.*)$ http://example.jp/data?mode=%1 [END] or [L,P]だとInternal Server Error。 RewriteRule ^$ http://example.jp/data?mode=%1 [END] or [L,P]にするとトップページが表示されます。 ^(.*)$か^$の違いです。 そのため2度目に教えていただいたサブドメイン下のパスにも対応した記述も Internal Server Errorになってしまいます。 そもそもサブドメインをリライトすることはできないのでしょうか。 サーバーはロリポップです。
TaichiYanagiya

2017/06/02 03:29

Internal Server Error の理由を知りたいのですが、エラーログは見ることができますでしょうか? 「^$」だとルールに引っかからずに、Not Found になると思うのですが、他の RewriteRule によってトップページが表示されるようになっていませんでしょうか? .htaccess に原因があるのか、それ以外に原因があるのか切り分けのため、'http://example.jp/data?mode=sub&id=123' にアクセスしてみてください。 ローカルのコマンドプロンプトからは 「curl -H "Host: example.jp" 'http://127.0.0.1/data?mode=sub&id=123'」などで確認できると思います。
cp_cop

2017/06/02 04:28

たびたび申し訳ありません。 shi_ueさんのご回答に対するコメントで書かせていただいたのですが、 他の設定箇所に問題があるのではないかと思い、 再度、.htaccessを白紙にしサブドメインのリライト記述のみを設定し試してみました。 サーバーのApacheは2.4です。 まずshi_ueさんに教えていただいた記述を試しました。 RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^(.*)$ http://example.jp/data?mode=%1&id=$1 [L] 結果は、リライトされずにURLが変わって表示(リダイレクト)されました。 次に試したものはRewriteRuleを相対パスで記述してみました。 RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^(.*)$ /data?mode=%1&id=$1 [L] 結果はInternal Server Errorになりました。 次に、/data?mode=%1&id=$1のスラッシュ(/)を取ってみました。 RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^(.*)$ data?mode=%1&id=$1 [L] 結果はInternal Server Errorではなく、 プログラム側で用意している読みエラーのページになりました。 次にRewriteRuleの(.*)をなくしてみました。 RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^$ /data?mode=%1&id=$1 [L] 結果は正しくリライトされました。 ただし、この記述だとサブドメイン以下に対応できません。 最後にRewriteRuleの(.*)をなくしURLで指定してみました。 RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^$ http://example.jp/data?mode=%1&id=$1 [L] 結果は、リライトされずにURLが変わって表示(リダイレクト)されました。 また、サブドメイン以下には対応できません。 エラーログを見れるかわかりませんが、何とか見てみたいと思います。
TaichiYanagiya

2017/06/02 04:32

httpd-2.4 とのこと、「RewriteRule ^(.*)$ /data?mode=%1&id=$1 [END]」でいいはずです。 [L] だとループして、Internal Server Error になるのでしょう。 書き換え後が http:// の場合、[L,P] とプロキシにしないとリダイレクトになります。
cp_cop

2017/06/05 02:02

最後までご回答いただきありがとうございました。 まだ完全に解決という訳ではないですが、なんとか思い通りの動作に近づきました。 あとはもう一工夫必要ですが、微調整をしながら解決していこうと思います。
guest

0

ベストアンサー

RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^$ http://example.jp/data?mode=%1 [L] ```でどうでしょう? 追記 --- Bash on Ubuntu on Windows上で検証してみました。Apacheは`2.4.18`です。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.).example.jp$
RewriteRule ^(.
)$ http://example.jp/?mode=%1&id=$1 [L]

以上のように設定すると、 |元アドレス|Rwrite結果| |:--|:--| |http://apple.example.jp|http://example.jp/mode=apple&id=| |http://apple.example.jp/123|http://example.jp/mode=apple&id=123| |http://example.jp|Rewriteされず| のようにRewriteされました。 もしこのように動作しない場合、他の設定箇所を確認してみてください。 Rewrite系の設定がどこかにあるかもしれません。 追記2 --- なんか言っている意味が理解できてきました。

RewriteEngine On
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP_HOST} ^(.).example.jp$
RewriteRule ^(.
)$ data?mode=%1&id=$1

ちなみに、`http://apple.example.jp/?u=123`など`QUERY_STRING`が入ってしまうとリライトしません。 もうひと工夫必要かもしれませんが・・・ 結果は以下のようになります。 |元アドレス|Rwrite結果(index.phpに渡されるパラメーター)| |:--|:--| |http://apple.example.jp|mode=apple&id=| |http://apple.example.jp/123|mode=apple&id=123| |http://apple.example.jp?t=123|Rewriteされず(t=123)| |http://example.jp|Rewriteされず| URLは`http://example.jp`に書き換わりませんが、ちゃんと`data`が呼ばれてパラメーターが引き渡されているので、これでいいんじゃないでしょうか?違う?

投稿2017/06/01 09:49

編集2017/06/02 06:01
shi_ue

総合スコア4437

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

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

cp_cop

2017/06/01 11:35

回答ありがとうございます。 まずはじめに質問文に誤りがありました。 今は訂正済みです。 誤)RewriteRule ^(.*)$ /data?mode=sub [L] ではなく 正)RewriteRule ^(.*)$ /data?mode=$1 [L] でした。 この記述でInternal Server Errorになってしまいます。 教えていただいた通りに記述してみました。 結果はエラーではなくトップルート(http://example.jp)が表示されました。 同じようにRewriteRule ^$ /data?mode=$1 [L]としてもトップルートが表示されました。 おそらく$1がサブドメイン部分を読み取れていないのだと思います。 どうすればよろしいでしょうか?
shi_ue

2017/06/01 13:25

よく見てください「 %1 」です。
cp_cop

2017/06/01 15:16

すいません。 書き方がわかりにくかったですね。 shi_ueさんのご回答通りに%1を試しましたが、トップルートが表示されてしまいました。 また、%1の部分を$1に変えてみても同じようにトップルートが表示されてしまいました。 わかりにくい説明で申し訳ありませんでした。
cp_cop

2017/06/02 04:26 編集

>Bash on Ubuntu on Windows上で検証してみました。Apacheは2.4.18です。 検証までしていただきありがとうございます。 お手数をお掛けして申し訳ありません。 教えていただいた設定を試したところshi_ueさんと違う動きをしました。 サーバーのApacheは2.4です。 他の設定箇所に問題があるのではないかと思い、再度、.htaccessを白紙にしサブドメインのリライト記述のみを設定し試してみました。 まず追記していただいた記述を試しました。 RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^(.*)$ http://example.jp/data?mode=%1&id=$1 [L] 結果は、リライトされずにURLが変わって表示(リダイレクト)されました。 次に試したものはRewriteRuleを相対パスで記述してみました。 RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^(.*)$ /data?mode=%1&id=$1 [L] 結果はInternal Server Errorになりました。 次にRewriteRuleの(.*)をなくしてみました。 RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^$ /data?mode=%1&id=$1 [L] 結果は正しくリライトされました。 ただし、この記述だとサブドメイン以下に対応できません。 最後にRewriteRuleの(.*)をなくしURLで指定してみました。 RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^$ http://example.jp/data?mode=%1&id=$1 [L] 結果は、リライトされずにURLが変わって表示(リダイレクト)されました。 また、サブドメイン以下には対応できません。 結果を比べてみると、 RewriteRuleを^(.*)$ではなく、^$で正しくリライトされますが、 サブドメイン以下(http://sub.example.jp/123)になった場合には当たり前ですがリライトされません。 何がいけないのか、どうしたらよいでしょうか? 追記 /data?mode=%1&id=$1のスラッシュを取ってみました。 RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.example\.jp$ RewriteRule ^(.*)$ data?mode=%1&id=$1 [L] 結果はInternal Server Errorではなく、 プログラム側で用意している読みエラーのページになりました。
shi_ue

2017/06/02 04:33

ちょっと質問内容と食い違っているように思います。 あなたは、 > 左のサブドメイン型のURLにアクセスすると、 > アドレスがそのまま変わらず右のページを表示されるということです。 > http://sub.example.jphttp://example.jp/data?mode=sub > http://apple.example.jphttp://example.jp/data?mode=apple > http://flower.example.jphttp://example.jp/data?mode=flower と言っていますが、これは、表示される、というのではなく、リライトされて裏でパラメーターとして渡される、ということを意味していますか?
cp_cop

2017/06/02 05:15

追記2のRwrite結果がまさに私がやりたいことです。 しかし、なぜかうまくいきません。。。 もう一度、最初から試してみます。 ちなみにRewriteRuleの最後に[L]はなくていいのでしょうか?
shi_ue

2017/06/02 05:17

L フラグは 「ラスト」なので最後に来ている場合は意味がありません。 Internal Server Error (500エラー)が出ているのでしたら、エラーログを確認してみてください。
cp_cop

2017/06/02 05:26 編集

ありがとうございます。 自分でもよくわからなくなってきてしまいました。。。 今は、http://example.jp/data?mode=sub、 または、http://example.jp/data?mode=sub&id=123 にアクセスすると表示されるページを http://example.jp/sub または、http://example.jp/sub/123 でも表示できるように RewriteRule ^([0-9a-zA-Z_\-]+)[/]?$ /data?mode=$1 [L] RewriteRule ^([0-9a-zA-Z_\-]+)/([0-9a-zA-Z_\-]+)[/]?$ /data?mode=$1&id=$2 [L] と記述した.htaccessを設置し要求どおりに動いています。 この感覚で http://sub.example.jp とアクセスすると http://example.jp/data?mode=subにリライト また、 http://sub.example.jp/123だと http://example.jp/data?mode=sub&id=123 にリライトされるようにしたかったのです。 追記2の実行結果がやりたいことでshi_ueさんの環境ではできているとのことなので もう一度、やってみます。
shi_ue

2017/06/02 05:33

それは条件が異なります。 dataというのはディレクトリではないですよね?拡張子の無いプログラムですか?
cp_cop

2017/06/02 05:40

はい、ディレクトリではありません。 data.cgiです。 拡張子を入力しなくても表示できるようにhtaccessに AddType application/x-httpd-cgi .cgi を記載しています。 そのため、拡張子(.cgi)を書いていませんでした。
shi_ue

2017/06/02 05:52

ごめんなさい、dataが抜けてました。 修正してみましたよ。
cp_cop

2017/06/02 06:03

ありがとうございます。 取り急ぎ試してみました。 その結果、データファイルCGIに記録されている最も新しいデータが表示されました。 もう一度、読み返してやってみます。
cp_cop

2017/06/05 02:02

最後までご回答いただきありがとうございました。 まだ完全に解決という訳ではないですが、なんとか思い通りの動作に近づきました。 あとはもう一工夫必要ですが、微調整をしながら解決していこうと思います。
guest

0

RewriteCond の後方参照は、$1 ではなく %1 で参照しますが、正しく記載されていますか?

投稿2017/06/01 13:23

CHERRY

総合スコア25171

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

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

cp_cop

2017/06/01 15:19

ご回答ありがとうございます。 %1を記載するとトップルートが表示されてしまいました。 何か方法はないものでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問