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

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

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

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

Apache

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4398閲覧

さくらのレンタルサーバーでcgiを用いた .pyがInternal Server Errorになる

Noisman

総合スコア14

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

Apache

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/06/07 10:49

編集2020/06/07 11:05

環境

本番環境
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.pycgi-bin/create_account.pyのフォームから値を受け取ってそれをdbにアクセスしたり、その結果を表示するためのcgi-bin/login.pycgi-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 -alcgi-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)

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

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

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

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

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

m.ts10806

2020/06/07 10:57

「表示できる」方のコードも提示してください。 ただそもそもさくらサーバってPython動きましたっけ。
Noisman

2020/06/07 11:09

表示できる方のコードを追加しました。 さくらサーバーは使うのが初めてなのですが、pythonが動くかどうかに関しては全く調べていませんでした。他の方も使っていたので、てっきり動くものだと思っていましたが・・・
otn

2020/06/07 13:38

質問文のコードで、<!-- を書いている部分は無いので、それを書いている部分を探せば良いのでは無いでしょうか。
Noisman

2020/06/07 13:51

アドバイスありがとうございます。  '<!-- ' を探してみましたが特に見つかりませんでした。
otn

2020/06/07 13:56

・探し足りない ・エラーメッセージの見誤り のどちらかなので、もっとよく見ましょう。
dodox86

2020/06/07 14:45

推測ですが、コメント"<!--" ...はもしかすると cgitbモジュールの出力かもしれません。 NGのlogin.pyの方、cgitb.enable() でCGI Tracebackを有効にして、print("Content-Type: text/html; charset=UTF-8\n\n") を出力する前までに異常終了しているかも。 > conn = sqlite3.connect('./hogehoge/hoge.db') sqlite3 に接続できていず、例外が発生しているのではないでしょうか。 cgitb.enable() の前か後、すぐに print("Content-Type: text/html; charset=UTF-8\n\n") を実行すると、エラー時のトレースバックの内容がhtmlで吐き出されます。
dodox86

2020/06/07 14:49

'./hogehoge/hoge.db' を絶対PATH指定にすると状況が変わるかもしれませんね。ご提示のコード全部を読んでいる訳でないので、半ば当てずっぽうですが。
Noisman

2020/06/07 16:05

dodox86 さん アドバイスありがとうございます。 どうやらデータベースのパスの指定が間違っていたようで、cgitb.enable()の出力が邪魔していたようですね。データベースを正しいパスで指定して実行したら無事解決できました!ありがとうございます
dodox86

2020/06/07 16:12

解決できてよかったです。原因と対応を添えて、自己解決/回答を投稿して質問を閉じていただければと思います。よろしくお願いします。
guest

回答1

0

自己解決

データベースへのパスが間違っていたため例外としてcgitb.enable()の内容が表示された際にInternal Server Errorとなってしまったようです。
正しいデータベースのパスを指定することで解決しました。

投稿2020/06/07 16:15

Noisman

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問