nginx try_files重写如果存在代理,如果不是

时间:2017-04-07 18:08:08

标签: nginx reverse-proxy jwilder-nginx-proxy

我正在使用function updateDocumentWithNewData(document, newData) { return new Promise(function(resolve, reject) { //some code... for (let key in newData) { if (newData.hasOwnProperty(key)) { //verifying if the document already has the property if (document.hasOwnProperty(key)) { return reject({'message' : 'a property already exists...'}); } //some code... } } //some more code... console.log("passed here!!!"); resolve(document); }); } nginx容器(https://github.com/jwilder/nginx-proxy)来代理对在其他docker容器中运行的docker实例的请求。每个子域都有自己的apache docker容器。其中一个子域( sub1 )需要一些特殊规则:

如果网址以" foo"开头那么我希望nginx检查文件是否存在。如果文件存在,那么它应该将URL重写为访问控制脚本(imageControl.php),并将其传递给通常的apache容器。如果该文件不存在,那么我希望将请求代理到远程服务器。

我认为我设置正确,但由于某种原因,nginx总是将请求发送到远程服务器 - 即使文件存在于本地。

以下是docker容器中nginx配置文件的相关部分:

default.conf(包含在nginx.conf中):

apache

/etc/nginx/vhost.d/sub1.mydomain.com:<< em>

upstream sub1.mydomain.com {
            ## Can be connect with "dockerized_default" network
            # dockerized_sub1
            server 172.18.0.2:80;
}
server {
    server_name sub1.mydomain.com;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    include /etc/nginx/vhost.d/sub1.mydomain.com;
    location / {
        proxy_pass http://sub1.mydomain.com;
    }
}  

请注意,我不希望nginx尝试运行imageControl.php(我没有使用location ^~ /foo/ { root /path/to/dockerized/webroot; try_files $uri @rewrite @remoteproxy; } location @remoteproxy { include vhost.d/remoteproxy.inc; proxy_pass http://remote.ip.address.here; } location @rewrite { rewrite ^/(.*)$ /imageControl.php?file=$1 break; } ) - 我希望nginx将它传递给上游的apache容器。

期望的行为示例:

  1. 此部分有效

  2. 此部分不起作用

  3. 我很感激一些帮助。

1 个答案:

答案 0 :(得分:1)

使用if -e表达式可能会更幸运:

location ^~ /foo/ {
    root /path/to/dockerized/webroot;
    if (-e $request_filename) {
        rewrite ^/(.*)$ /imageControl.php?file=$1 last;
    }
    include vhost.d/remoteproxy.inc;
    proxy_pass http://remote.ip.address.here;
}

有关详情,请参阅this document