環境
本番環境
Python 3.6.9
Server version: Apache/2.4.29 (Ubuntu)
ローカル環境
Python 3.6.6
MacOS
発生している問題
ローカル環境では全て動作することを確認済みで、本番環境であるさくらのレンタルサーバーで実行することを試みました。本番環境ではcgi-bin/index.py
は正常に表示され、そこからログインするためのcgi-bin/login_form.py
やアカウントを作成するためのcgi-bin/create_account.py
には正常にページ遷移できます。しかし、cgi-bin/login_form.py
やcgi-bin/create_account.py
のフォームから値を受け取ってそれをdbにアクセスしたり、その結果を表示するためのcgi-bin/login.py
やcgi-bin/done.py
に遷移しようとするとInternal Server Error
が表示されます。それ以外にもいくつか.pyファイルがありますが、それら全てにアクセスしてもInternal Server Error
が表示されてしまいます。apacheのエラーログのメッセージはResponse header name '<!--' contains invalid characters, aborting request, referer
です。
該当部分のソースコード
基本的な構造は同じだと思うので、cgi-bin/login_form.py
からcgi-bin/login.py
の一部を抜粋して貼ります。
まず、login_form.py
です
python
1#!/usr/bin/env python3 2#encoding:UTF-8 3import cgi 4import cgitb 5import textwrap 6import io,sys 7# UnicodeEncodeErrorを防ぐ 8sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 9cgitb.enable() 10 11print("Content-Type: text/html; charset=UTF-8\n\n") 12html =''' 13<!DOCTYPE html> 14<html lang = "ja"> 15<head> 16<title>hogehoge</title> 17</head> 18 <body> 19 <h1>hoge</h1> 20 <form 21 action = "./login.py" 22 method = "post" 23 > 24 <h2>user id : <input type = "text" name = "user_id" id='name'></h2> 25 <h2>pssword : <input type = "password" name = "password" minlength='8' id='pass'></h2> 26 <input type = "submit" value = "sign-in"> 27 </body> 28</html> 29'''.format().strip() 30print(html)
次に、login.py
です
python
1import cgi 2import cgitb 3import sqlite3 4import textwrap 5from http import cookies 6import hashlib 7import io,sys 8# UnicodeEncodeErrorを防ぐ 9sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 10cgitb.enable() 11conn = sqlite3.connect('./hogehoge/hoge.db') 12c = conn.cursor() 13form = cgi.FieldStorage() 14user_id = form['user_id'].value 15 16# クッキーを生成しuser_id を遷移先のページに渡す 17print("Set-Cookie: user="+ user_id) 18print("Content-Type: text/html; charset=UTF-8\n\n") 19 20html = textwrap.dedent(''' 21 <!DOCTYPE html> 22<html lang = "ja"> 23<head> 24<title>hoge</title> 25</head> 26 <body> 27 {0} 28 </body> 29</html> 30''').format(get(c, form)).strip() #get関数ではフォームの値からユーザーのパスワードが正しいかなどを検証して、その結果を表示しようとしています。 31print(html)
エラーメッセージ
上記のファイルから画面遷移した際にブラウザ上にはInternal Server Error
表示されます。
apacheのエラーログを確認したところ、
AH02429: Response header name '<!--' contains invalid characters, aborting request, referer: http://****/username/ディレクトリ名/cgi-bin/login_form.py
というように表示されています。
確認したこと・試したこと
ls -al
でcgi-bin
のファイルに実行権限があることは確認しました。- 似たような質問への回答で
print("Content-Type: text/html\r\n\r\n")
としてみてはとあったので試しましたが、結果は変わりませんでした。 - .htaccess には
AddHandler cgi-script .py
を追加しましたが、結果は変わりませんでした。 - ファイル名を .pyから .cgiに変更してみましたが、結果は変わりませんでした。
以上です。原因の究明に少し行き詰まってしまったので、悪さをしていそうな部分や他に試した方がいいことなどありましたら是非ご教授ください。よろしくお願いします。
追記
上に記載されているlogin_form.py
も表示できていますが、他にはindex.py
も表示されるので、こちらを追記しておきます。
python
1#!/usr/bin/env python3 2#encoding:UTF-8 3 4def check_cookie(cookie): 5 if 'user' in cookie: 6 str = ''' 7 <h2>Welcome {0}!</h2> 8 <a href='./hogehoge.py'>hogehoge</a> 9 '''.format(cookie['user'].value) 10 else: 11 str = ''' 12 <a href='./login_form.py'>Sign In!</a> 13 <a href='./create_account.py'>Sign Up!</a> 14 ''' 15 return str 16 17 18import cgi 19import cgitb 20import textwrap 21from http import cookies 22import os 23import io,sys 24# UnicodeEncodeErrorを防ぐ 25sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 26# クッキーの取得 27cookie = cookies.SimpleCookie(os.environ.get("HTTP_COOKIE","")) 28 29cgitb.enable() 30# クッキーが生成されていたらuserとして遷移先のページでもクッキーを渡し続ける処理 31if 'user' in cookie: 32 user = cookie['user'].value 33 print("Set-Cookie: user="+ user) 34print("Content-Type: text/html; charset=UTF-8\n\n") 35 36html = ''' 37<!DOCTYPE html> 38<html lang = "ja"> 39<head> 40<title>hogehoge</title> 41</head> 42 <body> 43 <h1>hoge</h1> 44 {get} 45 </body> 46</html> 47'''.format(get = check_cookie(cookie)).strip() 48 49print(html)
回答1件
あなたの回答
tips
プレビュー