Flask post请求本地正常服务器返回404

Ginson
  • 1
新手上路,请多包涵

定义了一个 post 请求函数用来删除服务器上的文件
app.py 代码如下

@app.route('/omaewamoushindeiru?filename=<string:filename>', methods=['POST'])
def delete(filename):
    imgname = UPLOADER + '/' + filename
    thumbname = UPLOADER + '/thumb_' + filename
    os.remove(imgname)
    os.remove(thumbname)
    flash('删除成功')
    return redirect(url_for('index'))

index.html 代码如下

{% for pic in pics %}
<!-- 略 -->
<form method="post" action="{{ url_for('delete', filename=pic) }}">
<input class="btn" type="submit" value="删除" onclick="return confirm('Are you sure?')">
</form>
<!-- 略 -->
{% endfor %}

在本地(windows)运行时可正常通过 post 删除文件并重定向到首页
image.png

同样代码部署到服务器上则请求直接返回 404
image.png

搞不清楚原因,有哪位可以指点一下吗?

回复
阅读 286
1 个回答
Ginson
  • 1
新手上路,请多包涵
✓ 已被采纳

找到原因了,自问自答一下,引以为戒。

感谢 @sobright 提醒我查看日志,逐步定位并解决了问题。

首先我发现 gunicorn 没有打印我发起的 post 请求的记录,说明请求是在 nginx 层就被处理并返回 404了。于是我又去看了 nginx 的网站日志,竟然也没有发现请求记录,再查看 nginx 配置文件时发现了这么一段

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
     expires      30d;
     error_log /dev/null;
     access_log /dev/null;
}

原来 nginx 没记录是因为我 post 请求的地址是

127.0.0.1:5000/omaewamoushindeiru%3Ffilename%3Dimage.jpg

由于上面的规则被 nginx 没有将 .jpg 结尾的请求记录写入日志文件,同时因为这个请求地址中的 ? = 被转义成了 %3F %3D,服务器把整个地址当成图片地址去找文件,没找到于是返回 404

本地没有这个问题是因为本地不需要用 nginx 做端口转发,没有涉及到 location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ 这个规则

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏