Как я могу решить 404 ошибки, вызванные CGIRootFix? - PullRequest
0 голосов
/ 26 ноября 2018

Я развертываю 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-адресами?

1 Ответ

0 голосов
/ 27 ноября 2018

Я так и не понял, как заставить работать это исправление, однако, я полагаю, что это может быть потому, что это устаревшее решение.Мне удалось исправить ссылки со следующими изменениями в моем коде:

Добавление app.config['_external']=True в конфигурацию, а затем в файле .cgi добавление os.environ['SCRIPT_NAME']="" прямо перед строкой выполнения приложения.Вы также можете добавить SCRIPT_NAME="" в конфигурацию вашего сайта, и она будет работать только в том случае, если также задан _external.Конечным результатом является то, что он не работает, и мои URL-адреса верны.

Очень надеюсь, что это поможет кому-то еще в такой же ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...