Я развертываю Flask на общем сервере, где мне нужно обслуживать его с помощью CGI.Мне удалось удалить имя файла из URL-адресов с помощью следующего кода .htaccess:
AddHandler cgi-script .cgi .pl
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /home/tetra/public_html/cgi-bin/tetra.cgi/$1 [L]
Однако каждый раз, когда я использую url_for () для создания ссылки, он вставляет обратно путь к файлу cgi-binв ссылку, поэтому https://servername/auth/login
становится https://servername/cgi-bin/app.cgi/auth/login
.
Когда я удаляю cgi-bin/app.cgi/
из URL, URL работает нормально.При поиске этой проблемы я вижу, что CGIRootFix, вероятно, можно использовать для решения этой проблемы, удалив путь к файлу из URL:
http://werkzeug.pocoo.org/docs/0.14/contrib/fixers/
Я попытался добавить это в мой файл CGI:
from werkzeug.contrib.fixers import CGIRootFix
app = CGIRootFix(app,app_root='/')
Полный файл:
#!<path redacted>
#path to python packages
import sys
sys.path.insert(0, '<path redacted>')
from wsgiref.handlers import CGIHandler
from myapp import app
from werkzeug.contrib.fixers import CGIRootFix
app = CGIRootFix(app,app_root='/')
if __name__ == '__main__':
CGIHandler().run(app)
Это решает проблему с сгенерированными URL-адресами, которые генерирует url_for (), которые я могу проверить из оболочки фляги через командную строку:
>>> from flask import url_for
>>> url_for('main.index')
'http://servername/'
>>> url_for('auth.login')
'http://servername/auth/login'
Но ... посещение URL теперь вызывает ошибку 404.Ни одна из страниц не загружается с использованием какого-либо URL-адреса, будь то нужные URL-адреса или URL-адреса с включенными именами файлов.Это, должно быть, какая-то глупая проблема конфигурации, но документация немного тонкая, как и другие вопросы, которые я нашел по этой проблеме.
Я также пробовал app.wsgi_app = CGIRootFix(app.wsgi_app,app_root='/')
и несколько других вариантов из потоковРанее я видел.
Есть идеи, что вызывает 404, когда я использую CGIRootFix, и что я могу сделать, чтобы заставить его загрузить страницу с желаемыми URL-адресами?