如何解决CGIRootFix引起的404错误?

时间:2018-11-26 06:45:38

标签: python-3.x flask cgi

我正在将Flask部署在需要使用CGI服务的共享服务器上。我已经能够使用以下.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/时,该网址可以正常工作。在搜索此问题时,我看到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()的问题,我可以通过命令行从flask shell进行测试:

>>> 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='/')和以前见过的线程的其他一些变化。

您知道我使用CGIRootFix时是什么导致404的吗?如何使它加载具有所需URL的页面?

1 个答案:

答案 0 :(得分:0)

我从来没有想过如何使此修复程序起作用,但是,我认为可能是因为这是一个过时的解决方案。我可以通过对代码进行以下更改来修复链接:

app.config['_external']=True添加到配置中,然后在.cgi文件中,在应用执行行之前添加os.environ['SCRIPT_NAME']=""。您也可以将SCRIPT_NAME=""添加到站点的配置中,并且仅在还设置了_external的情况下,它才有效。最终结果是它不起作用并且我的URL是正确的。

真的希望这可以帮助处于相同情况的其他人。