qjelsvif
@qjelsvif

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

flaskによるwebサイトのurlにindex.cgiを入れないようにしたい

実装したいこと

urlにindex.cgiを入れないようにしたい

現在flaskでwebサイトを作成しています
cgiでpyを実行してサーバーに置いたところ動作はするのですが他のページに遷移したときに

(domein)/index.cgi/testpage

となります
これを

(domein)/testpage

としたいです

.htaccessでリダイレクト設定をいろいろ試しているのですがうまくいきません

該当するソースコード

.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On

    # HTTPSリダイレクト(オプション)
    RewriteCond %{HTTPS} !=on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    # /index.cgi/以下のパスを index.cgi にリダイレクト
    RewriteCond %{REQUEST_URI} ^/index.cgi/(.*)
    RewriteRule ^index.cgi/(.*)$ /index.cgi?$1 [L]
    
    # リクエストされたファイルが存在しない場合、index.cgiにリダイレクト
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.cgi?$1 [L]
</IfModule>



index.cgi

#! /home/~hoge~/python

from wsgiref.handlers import CGIHandler
from app import app

CGIHandler().run(app)

app.py

from flask import Flask, jsonify, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('home.html')

@app.route('/testpage')
def testpage():
    return jsonify({'message': 'This is a test page!'})

if __name__ == '__main__':
    app.run(debug=True)

0

2Answer

HTTPSリダイレクトは問題無さそうですが、その次のRewriteRuleらの
条件、^index.cgi/(.*)$^(.*)$が一緒なので二重の書き換えが発生しているのと

Substitutionindex.cgi?$1 とクエリを渡されてますから、@app.routeが効かないでしょう。
普通index.cgi/<path><query>な形式でないとルートとして認められないかと。

原因の切り分けとして、余計な追記をせず、以下を試してどうなるか確認なさってください。

.htaccess
DirectoryIndex index.cgi
Options +ExecCGI

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.cgi/$0 [L]

https://example.com/testpageとしてアクセスできるはずです。

しかしhttps://example.com/index.cgi/testpageにも引き続きアクセスできます。これは端的に申し上げると仕様なので諦めるかcgi側で何とかしてください。


あとdomeinではなくdomainです。

2Like

Comments

  1. @qjelsvif

    Questioner

    お二方回答ありがとうございます
    とても参考になります

    domeinではなくdomainでしたか笑
    にわか開発者がばれます...w

  2. @qjelsvif

    Questioner

    .htaccessを変更してみましたが
    index.cgi/testpage
    は表示されるものの
    /testpage
    は404エラーでした

  3. 404エラーでした

    であればドキュメントルートに/index.cgiが無い(パスが合ってない)ということになります。
    ディレクトリ構成はどうなっていますか?

    .htaccess, index.cgi, app.pyを置いた位置など詳細に書いてください。

    なお私が提示している.htaccessはドキュメントルートの最上位にある必要がありますが、それ以外はSubstitutionのパスさえ合わせていればサブディレクトリ(たとえば/flaskというディレクトリにcgiとpyがあるならSubstitutionのパスは/flask/index.cgi/$0となる)でも良いです。
    それかその3つのファイル共に最上位に合わせるかです。

    あとサーバーの情報など書かれてないのですが、必要そうな情報は質問元を編集して書いておいてください。

ご使用のwebサーバーのマニュアルを見て正しい設定をしてください。


何の条件も書いてないので、Linux上のdocker/wgetが使える環境前提でperl CGIを利用するサンプルを用意しました。pythonでも同じです。

hoge.sh
set -eux
docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > httpd.conf
patch -p0 <<EOF
--- httpd.conf	2024-08-19 07:12:25.861709164 +0900
+++ httpd2.conf	2024-08-19 07:01:29.435758340 +0900
@@ -181,7 +181,7 @@ LoadModule autoindex_module modules/mod_
 #LoadModule info_module modules/mod_info.so
 #LoadModule suexec_module modules/mod_suexec.so
 <IfModule !mpm_prefork_module>
-	#LoadModule cgid_module modules/mod_cgid.so
+	LoadModule cgid_module modules/mod_cgid.so
 </IfModule>
 <IfModule mpm_prefork_module>
 	#LoadModule cgi_module modules/mod_cgi.so
EOF
if ! test -d htdocs; then
    mkdir htdocs
fi
if ! test -d cgi-bin; then
    mkdir cgi-bin
fi
cat >cgi-bin/first <<EOF
#!/usr/bin/perl
use strict;
use warnings;

print "Content-type: text/html\n\n";
foreach my \$key (keys %ENV) {
    print "\$key --> \$ENV{\$key}<br>";
}
EOF
chmod a+x cgi-bin/first
docker run -d --rm --name my_apache \
    -v "$PWD/htdocs/":/usr/local/apache2/htdocs/ \
    -v "$PWD/cgi-bin/":/usr/local/apache2/cgi-bin/ \
    -v "$PWD/httpd.conf":/usr/local/apache2/conf/httpd.conf \
    -p 80:80 \
    httpd:2.4
sleep 10
wget -O - 'http://localhost/cgi-bin/first'
docker stop my_apache
1Like

Comments

  1. @qjelsvif

    Questioner

    回答ありがとうございます
    開発初心者でして見当違いのことを質問していたら申し訳ありません
    現在エックスサーバーのレンタルサーバーで開発をしています
    wgetはデフォルトで使えるようですがdockerは対応していないみたいです
    その場合はvpsを使えばできるのでしょうか

  2. 全て他人に聞くのではなく、きちんと調べて分からない点のみを聞きましょう。

    • 実際に何を実現したいのか(最低限したいことのみ)
    • それに際し、何をしてみて結果どうだったのか(詳細に)
    • エックスサーバーのレンタルサーバーではなく、サーバーが何を使用していて、バージョンがいくつなのか
    • エックスサーバーのレンタルサーバーではなく、管理者権限を持っていないこと
    • 現状のCGIの実現方法(実はFCGIなのかそうでないのか)
    • apache2.4ならapache2.4固有の方法でパラメータを取得した結果
    • 試した設定のその結果の詳細
    • 現状何なら出来そうだと思っているのか

    くらいは最低限記述しましょう

Your answer might help someone💌