Django / Python http.server通过代理访问404s,在本地工作

时间:2017-05-31 06:38:59

标签: python django python-3.x http proxy

我之前遇到的问题是我无法查明我的Django应用程序中的罪魁祸首,导致所有请求达到404. See the previous Stackoverflow question.

从那以后,我试图缩小问题的范围,因此开始了一个新的,非常基本的Django应用程序。

所有项目包括:

$ django-admin startproject tempor

我添加了测试目录并导入了测试函数

$ vi tempor/tempor/urls.py

from django.conf.urls import url
from django.contrib import admin

from tempor.views import test

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test/$', test),
]

views.py和测试函数

$ vi tempor/tempor/views.py

from django.http import HttpResponse

def test(request):
        return HttpResponse("OKAY")

然后我按照Django的建议迁移了项目:

$ python manage.py check

$ python manage.py migrate

现在我运行服务器:

$ python3 manage.py runserver 0.0.0.0:8282

从本地服务器访问:

$ curl localhost:8282/test/
OKAY
$ curl <server-public-IP>:8282/test/
OKAY

从外部系统访问(通过代理)

$ curl <server-public-IP>:8282/test/

<!DOCTYPE html>
<html lang="en">
[...]
<h1>Page not found <span>(404)</span></h1>
[...]
</html>

在settings.py中我有:

ALLOWED_HOSTS = ['*']

如果我不使用'*',则会在调试开启时相应地通知外部系统:

$ curl <server-public-IP>:8282/test/
[...]
DisallowedHost at http://<server-public-IP>:8282/test/
[...]

如果我尝试使用简单的Python HTTP服务器(Django admin.py基本上使用它),也会发生这种情况。

echo "OKAY" > /tmp/test/index.html
cd /tmp/test/
python -m http.server 8282
[...]

本地访问:

$ curl localhost:8282/index.html
OKAY
$ curl <server-public-IP>:8282/index.html
OKAY

远程访问:

$ curl <server-public-IP>:8282/index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
[...]
<p>Error code explanation: HTTPStatus.NOT_FOUND - Nothing matches the given URI.</p>
[...]
</html>

http.server日志:

Serving HTTP on 0.0.0.0 port 8282 ...
<server-public-ip> - - [<timestamp>] "GET /index.html HTTP/1.1" 200 -
<proxy-ip> - - [<timestamp>] code 404, message File not found
<proxy-ip> - - [<timestamp>] "GET http://<server-public-ip>:8282/index.html HTTP/1.1" 404 -

目前,代理是一个简单的SSH端口转发 - 稍后将由NGINX替换。

编辑:如果我为Django应用运行uwsgi,则同样适用:

$ uwsgi --http :8282 --module tempor.wsgi

本地访问工作 - 外部请求404。

为什么通过代理404向我发出请求以及如何解决此问题?

1 个答案:

答案 0 :(得分:1)

解决了,但我不明白为什么

问题是使用SSH端口转发直接访问Python服务器。中间Nginx解决了这个问题。

See my ServerFault question for further details.

对于服务器设置,请参阅ServerFault问题。

客户端设置归结为:

# SSH port forwarding, port 80 for Nginx access, port 8282 for direct Python webserver access
ssh -L 8181:<farawayhost-ip>:<80 or 8282> <sshuser>@<remotehost-ip>

# on a second terminal
export http_proxy=127.0.0.1:8181
curl <farawayhost-ip>