Gulp Express应用程序在更改NginX位置块时无法获取静态内容

8xiog9wr  于 2022-12-08  发布在  Gulp
关注(0)|答案(2)|浏览(134)

我有一个express. jsAngularJs应用程序,它使用gulp构建和服务于不同的环境(即开发/登台/测试/生产),并使用NginX作为反向代理。

NodeJS应用

该应用程序是根据John Papa的AngularJS风格指南编写的,吞咽配置在很大程度上受到了this sample application of his的启发。
本申请的基本部分的结构如下:

/build  (created on the fly, optimizes code)
/src (no optimiztion)
    /client
        /app
        /content
        /test
        index.html
    /server
        /data
        /routes
gulpfile.js

Express中间件摘录

// /src/server/app.js
switch (environment){
    case 'stage':
    case 'build':
        console.log('** BUILD **');
        console.log('serving from ' + './build/');           
        app.use('/', express.static('./build/'));
        break;
    default:
        console.log('** DEV **');
        console.log('serving from ' + './src/client/ and ./');
        app.use('/', express.static('./src/client/'));
        app.use('/', express.static('./'));
        break;  
}

app.listen(port, function() {
    console.log('Express server listening on port ' + port);
    console.log('env = ' + app.get('env') +
        '\n__dirname = ' + __dirname  +
        '\nprocess.cwd = ' + process.cwd());
});

反向代理服务器

我使用NginX作为Express服务器的反向代理,可以使用下面的配置在 my_domain_name 访问它。

upstream my_nodejs_upstream {
    server 127.0.0.1:7203;
    keepalive 64;
}

server {
    listen 80;
    server_name my_domain_name;
    return 301 https://$server_name$request_uri;
}

server {

    # SSL configuration

    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_max_temp_file_size 0;
    proxy_pass http://my_nodejs_upstream/;
    proxy_redirect off;
    proxy_read_timeout 240s;
}

这是可行的,但我最终希望能够访问位于 my_domain_name/app 的应用程序,因此我认为只需更改位置URI即可。

location /app/ {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_max_temp_file_size 0;
    proxy_pass http://my_nodejs_upstream/;
    proxy_redirect off;
    proxy_read_timeout 240s;
}

这不起作用。我可以通过express服务器访问应用程序,即my_domain_name:7203,但尝试访问my_domain_name/app时,我收到了关于所有静态内容的404错误。似乎“/app/”部分没有被传递。例如,请求缩小的CSS仍在 * https://my_domain_name/content/all.min-06c3b402.css * 完成,而此时文件位于 * https://my_domain_name/app/content/all.min-06c3b402.css *。

我真的不知道该怎么继续下去。

编辑1(2018年3月1日)

省略/,即如果我放入location /块,proxy_pass http://my_nodejs_upstream;仍然可以工作,但不能放入location /app。但这次我遇到了不同的错误,因为我根本无法访问它:Cannot GET /app。我还用一些附加信息更新了OP(即Express Middleware摘录部分)。

gcmastyq

gcmastyq1#

您写道:

proxy_pass http://my_nodejs_upstream/;

我很确定你应该写:

proxy_pass http://my_nodejs_upstream;

没有结尾的/。结尾的/是一个url,并且proxy_pass指令的行为方式与是否为它提供url不同(添加的粗体):
如果使用URI指定proxy_pass指令,则在将请求传递到服务器时,标准化请求URI中与位置匹配的部分将替换为指令中指定的URI(...)
对比
如果指定proxy_pass时没有指定URI,则请求URI将以与处理原始请求时客户端发送的格式相同的格式传递到服务器,或者在处理更改的URI(...)时传递完整的规范化请求URI
其他解决方案可能暗示使用位置捕获并在proxy_pass指令上重用它,或者在此proxy_pass重写中添加$request_uri,但我认为这里不需要它。

s71maibg

s71maibg2#

我也遇到了这个问题,我通过改变express上的路径来解决它,而不是响应app.get("/"),我传递了nginx上的位置名称,在您的情况下应该是app.get("/app")

相关问题