首页 > 解决方案 > 如何在 Windows 上使用 nginx 从 XHR 到 Laravel 代理文件上传与 multipart/form-data?

问题描述

我在网上搜索了一天多相同类型的问题,几乎尝试了所有解决方案,但我无法找到解决方案。

情况:我有一个域,其 A 记录指向我的公共 IP 地址,它运行 Windows Server 2012 R2。在端口 80 上,我有 nginx 代理 http 请求(我们现在不关心 https)。nginx 会将请求代理到 apache 虚拟主机,apache 本身在端口 9090 上运行。

我们运行的应用程序在前端有 Angular 4,在后端有 Laravel 5.6,但是,由于 Angular 4 的 httpClient 在发送我们想要用于文件上传的 multipart/form-data 请求时存在一些问题,我们使用普通 XHR 进行 POST和 PUT 请求。

另外我需要提一下,我已经使用此链接从网站上新下载了预构建包,即我没有从源代码构建它。

实际行为:使用上述设置发送此类 POST 和 PUT 请求时,我们不会从服务器获得响应。我们也有以下状态:

期望的行为,我们想要的:我们应该能够发送带有 POST 和 PUT 请求的文件,就像 GET 等任何其他方法一样。

代码:

nginx.conf

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    sendfile        on;
    server_names_hash_bucket_size  64;

    proxy_redirect          off;
    proxy_set_header        Host            $host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    client_max_body_size    10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout   90;
    proxy_send_timeout      90;
    proxy_read_timeout      90;
    proxy_buffers           32 4k;

    server {
        proxy_request_buffering off;
        server_name myhost.net;
        location / {
            proxy_pass http://myhost.local:9090;
        }
    }

}

Apache 虚拟主机配置:

<VirtualHost *:9090>
    DocumentRoot "C:/path/to/htdocs"
    ServerName localhost
</VirtualHost>

<VirtualHost *:9090>
    DocumentRoot "C:/path/to/htdocs/myhost/public"
    ServerName myhost.local
    ServerAlias myhost.net
    ErrorLog "C:/path/to/apache/logs/vhosts/myhost.local-error.log"
</VirtualHost>

Windows 主机文件,虽然我认为它不重要:127.0.0.1 myhost.local ::1 myhost.local

myhost.net正如我从域 DNS 中提到的,被路由到公共 IP。

如果我错过了什么,请告诉我。

更新1:

我已经能够找到问题所在。防火墙,无论是 windows 服务器防火墙还是网络防火墙都会阻止流量。但是,如果我打开两个防火墙它都可以正常工作,那么它们中的任何一个都处于打开状态,并且只有当我们允许 HTTP 或 HTTPS 流量时,我们才会再次遇到同样的问题。

这证明了 nginx 和 laravel 配置都很好,但是,仍然存在一个问题,使防火墙阻止它们的请求有什么问题?

标签: phplaravelnginxmultipartform-datafirewall

解决方案


推荐阅读