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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Apache

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

Q&A

2回答

1404閲覧

Apache httpd でクエリ文字列が設定されていないときのみ、リダイレクトしたい

mit0223

総合スコア3401

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Apache

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

0グッド

0クリップ

投稿2018/06/30 04:59

編集2018/06/30 13:14

前提・実現したいこと

Apache httpd でクエリ文字列に remote_addr=xxxx が設定されていないときのみ、リダイレクトしたいが、正規表現の前に ! をつける方法でのマッチングがうまくいかない。

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

curl で確認したところ、クエリ文字列に remote_addr=xxxx が設定されている場合でもリダイレクトされてしまう。

$ curl -v http://test.example.com/?remote_addr= * Trying 192.168.56.40... * TCP_NODELAY set * Connected to test.example.com (192.168.56.40) port 80 (#0) > GET /?remote_addr= HTTP/1.1 > Host: test.example.com > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 302 Found < Date: Sat, 30 Jun 2018 00:50:33 GMT < Server: Apache/2.4.6 (CentOS) < Location: http://echoip.example.com/ < Content-Length: 214 < Content-Type: text/html; charset=iso-8859-1 < <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>302 Found</title> </head><body> <h1>Found</h1> <p>The document has moved <a href="http://echoip.example.com/">here</a>.</p> </body></html> * Connection #0 to host test.example.com left intact

該当のソースコード

以下の RewriteCond で クエリ文字列に remote_addr= が含まれていないときのみリダイレクトするように設定したつもりであるが、上記の通り、remote_addr= が含まれていてもリダイレクトされてしまう。
以下のコードを /etc/httpd/conf.d/test.conf として置いた。

<VirtualHost *:80> ServerName test.example.com RewriteEngine On RewriteCond %{QUERY_STRING} !^remote_addr= RewriteRule .* http://echoip.example.com/ </VirtualHost>

試したこと

上記の RewriteCond で ! を外すと、remote_addr= があるときだけリダイレクトされる。


6/30 追記
回答いただいた内容に従って、 ! を使わずに単にクエリ文字列が空であることを検出しようとしましたが、だめでした。

<VirtualHost *:80> ServerName test.example.com RewriteEngine On RewriteCond %{QUERY_STRING} ^$ RewriteRule .* http://echoip.example.com/ </VirtualHost>

これでもhttp://test.example.jp/?remote_addrはリダイレクトされました。

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

Vagrant box の Cent OS に yum install httpdでインストールした apache でテストしました。

# httpd -v Server version: Apache/2.4.6 (CentOS) Server built: Apr 20 2018 18:10:38 # cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)

端末(Mac OS)の /etc/hosts ファイルを書き換えて curl から名前でアクセスできるようにしてテストしました。

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

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

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

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

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

Orlofsky

2018/06/30 07:01

回答依頼を頂きましたが、わたしはApacheはほとんどわかりません。
mit0223

2018/06/30 07:04

Orlofsky 様、失礼しました。(一応、候補に上がった方の中から apache のタグの点数の上位の方を選んだのですが)
mit0223

2018/06/30 12:11

Orlofsky様、109位でも3682人の中のなので偏差値でいうと70台です。充分救世主です。私は28位ですが、この件については、かなり困ってます。もし、何かわかることがありましたら、教えてください。
guest

回答2

0

!^remote_addr=となっているため、remote_addr=で始まらなかったら、という意味になっていると思います。

以下の動作が希望の動作でしょうか?

[root@9f47dbb4b5c9 ~]# httpd -v Server version: Apache/2.4.6 (CentOS) Server built: Apr 20 2018 18:10:38 [root@9f47dbb4b5c9 ~]# [root@9f47dbb4b5c9 ~]# [root@9f47dbb4b5c9 ~]# diff /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.org 157,162d156 < < RewriteEngine On < RewriteCond %{QUERY_STRING} !remote_addr= < RewriteRule .* http://echoip.example.com/ < < [root@9f47dbb4b5c9 ~]#
  • パラメータなしはリダイレクト
[root@9f47dbb4b5c9 ~]# [root@9f47dbb4b5c9 ~]# [root@9f47dbb4b5c9 ~]# curl -D - -s -o /dev/null http://localhost/ HTTP/1.1 302 Found Date: Sun, 01 Jul 2018 11:44:58 GMT Server: Apache/2.4.6 (CentOS) Location: http://echoip.example.com/ Content-Length: 210 Content-Type: text/html; charset=iso-8859-1 [root@9f47dbb4b5c9 ~]#
  • remote_addr=が含まれる場合はリダイレクトされない
[root@9f47dbb4b5c9 ~]# curl -D - -s -o /dev/null http://localhost/?remote_addr= HTTP/1.1 200 OK Date: Sun, 01 Jul 2018 11:45:08 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Sun, 01 Jul 2018 11:44:30 GMT ETag: "e-56fee9aa49450" Accept-Ranges: bytes Content-Length: 14 Content-Type: text/html; charset=UTF-8 [root@9f47dbb4b5c9 ~]#
  • remote_addr=が含まれる場合はリダイレクトされない
[root@9f47dbb4b5c9 ~]# curl -D - -s -o /dev/null http://localhost/?hoge=fuga\&remote_addr= HTTP/1.1 200 OK Date: Sun, 01 Jul 2018 11:45:15 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Sun, 01 Jul 2018 11:44:30 GMT ETag: "e-56fee9aa49450" Accept-Ranges: bytes Content-Length: 14 Content-Type: text/html; charset=UTF-8 [root@9f47dbb4b5c9 ~]#
  • remote_addrが含まれない場合はリダイレクト
[root@9f47dbb4b5c9 ~]# curl -D - -s -o /dev/null http://localhost/?hoge=fuga HTTP/1.1 302 Found Date: Sun, 01 Jul 2018 11:45:22 GMT Server: Apache/2.4.6 (CentOS) Location: http://echoip.example.com/?hoge=fuga Content-Length: 220 Content-Type: text/html; charset=iso-8859-1

投稿2018/07/01 11:51

takyafumin

総合スコア2335

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

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

mit0223

2018/07/03 02:08

検証していただき、ありがとうございます。希望のどおり動作するはずということですね。ちょっと、今バタバタしておりまして、時間が取れません。週末にはこちらで同じ検証をやってみます(といっても virutualhost の中かどうかくらいしか差がないような気がします)。しばらく、お時間をください。
guest

0

[質問への追記・修正の依頼]では改行できないのでコードを書けないのこっちに移動しました。

mod_rewrite を使ったアクセス拒否いろいろ にある、

Apache

1# リファラが空だったら拒否 2RewriteEngine On 3RewriteCond %{HTTP_REFERER} ^$ 4RewriteRule ^.*$ - [F,L]

をREMOTE_ADDRがないかの判断に応用できませんか?
Apacheは解っていないのではずしていたらごめんなさい。

投稿2018/06/30 12:46

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問