QA@IT

Squidを用いたリダイレクトプログラム

7081 PV

環境
Centos7
Squid 3.3.8
Python 3.4.3

Squidのリダイレクター機能を利用して、ある条件にあったURLを別のURLに整形、該当URLを外部ファイルに書き出して記録を行うプログラムをpythonで作成しています。
Squidには、外部のプログラムを使ってリクエストされたURLを書き換える機能が実装されており、url_rewrite_programを利用しています。外部プログラムはpython3で作成しています。

以下、pythonのコード

#!/usr/bin/python

import sys, re, csv

pattern = r"dmm"

def url(line):
    new_url = line
    matchline = re.search(pattern, line)
    if matchline:
        obj = open("sample.txt","a", encoding="UTF-8")
        obj.write(line)
        obj.close()
        new_url = "http://www.youtube.co.jp"
    return new_url

while True:
    line = sys.stdin.readline().strip()
    new_url = url(line)
    sys.stdout.write(new_url)
    sys.stdout.flush()

今回は暫定的にURLにdmmが含まれていたら”http://www.youtube.co.jp” にリダイレクトさせます。
上記プログラムをsquidのステータスでは呼び出しているのですがブラウザでdmm.comにアクセスした際、リダイレクトされません。

条件に合致したURL にアクセスした場合に別URLにリダイレクトさせ、該当URLを外部ファイルに書き出すために有効な手段はありますか。

回答

下記のページを見てみたんですが、リダイレクトの場合は「302:URL」等の形で、ステータスつきで返す必要があるみたいですね。

http://wiki.squid-cache.org/Features/Redirectors

status
The HTTP 301, 302 or 307 status code. Please see section 10.3 of RFC 2616 for an explanation of the HTTP redirect codes and which request methods they may be sent on.

追記

問題なく動くとはyoutubeにリダイレクトされsample.txtが作成されたということでしょうか?

はい。sample.txtは/var/spool/squidに作成されました。以下、こちらの環境等を書いておきます。

/etc/squid/squid.confへの追記内容

url_rewrite_program /var/tmp/redir.py
url_rewrite_children 20 startup=0 idle=1 concurrency=0

/var/tmp/redir.pyの内容

#!/usr/bin/python

import sys, re, csv

pattern = r"dmm"

def url(line):
        new_url = line
        matchline = re.search(pattern, line)
        if matchline:
                obj = open("sample.txt","a")
                obj.write(line + "\n")
                obj.close()
                new_url = "302:http://www.youtube.co.jp"
        return new_url

while True:
        line = sys.stdin.readline().strip()
        new_url = url(line)
        sys.stdout.write(new_url + "\n")
        sys.stdout.flush()

utusemi_f99さんのコードを元にしています(ほぼ同じです)が、変更点は下の通りです。

  • openの引数をPython 2.7用に変更した
  • obj.write時とsys.stdout.write時に改行を追加した
  • new_urlの先頭に"302:"を付加した

Pythonのバージョンはシステム標準の2.7.5です。Software CollectionsからPython 3.4.2を入れてみたんですが、環境を切り替えないといけないみたいで、単純に

#!/usr/bin/env python3

としたのではだめっぽいです。で、とりあえず諦めました:-)

編集 履歴 (4)
  • ご指摘ありがとうございます。
    今回 "302:http://www.youtube.co.jp"と指定して試みましたがうまくリダイレクトされませんでした。
    「301」や「302」などのHTTPリダイレクトメッセージを返す機能があるようですが私の場合それより前でつまずいてしまっているようです。
    -
  • そうですか。もう少し詳細が分からないと何とも言えないですが、pythonのコードを見て気になったのは、new_urlの後ろに改行('\n')をつけてない点ですかね。
    -
  • 試しに自分の環境(CentOS 7.1/Squid 3.3.8)でやってみたら、特に問題なく動くようです。スクリプトを/var/tmp/redir.pyで作成したんですけど、最初SELinuxでエラーになったので、Permissiveモードに切り替えたら動きました。
    -
  • 検証ありがとうございます。
    スクリプトを/etc/squid/sample/resample.pyで作成していましたが/var/tmp/resample.pyに変更したところ、SELinuxでエラーがでました。Permissiveモードに切り替えたらスクリプトは動いているようでした。
    -
  • 現状、上記プログラムをpython2に変更して読み込んでいます。python3ではうまく行きませんでした。挙動はブラウザでdmm.comにアクセスしようとした場合、読込中が続いています。他のサイトの場合も同様でした。 -
  • 問題なく動くとはyoutubeにリダイレクトされsample.txtが作成されたということでしょうか?よろしければ挙動成功時の環境(squid.confへの追記内容など)やpythonのバージョン等を教えて下さい。 -
  • 追加の質問への回答を追記しておきました。 -
  • 間違ってリライトの方を書いてたので、リダイレクトの方(302:URL)に変えておきました。 -
  • 今回の問題点は主にスクリプトファイルのディレクトリとurlの返答に改行("\n")コードが必須、SELinuxという三点でした。検証と丁寧な回答ありがとうございました。 -
  • また、私の環境ではpyhon3のインストール場所を指定して url_rewrite_program /usr/local/bin/anaconda3/bin/python3 /var/tmp/resample.py とすることでpython3での実行ができました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。