2017-04-07 122 views
0

我使用的是nginxdocker容器(https://github.com/jwilder/nginx-proxy)代理請求到其他搬運工容器中運行的apache實例存在代理。每個子域都有自己的apache docker容器。其中一個子域(sub1)需要一些特殊規則:nginx的try_files改寫如果要是不

如果URL以「foo」開頭,那麼我希望nginx檢查文件是否存在。如果該文件存在,那麼它應該在URL重寫訪問控制腳本(imageControl.php),並把它傳遞到通常阿帕奇容器。如果該文件不存在,我想請求被代理到遠程服務器。

我認爲我正確設置好了,但由於某種原因nginx的總是將請求發送到遠程服務器 - 即使該文件存在本地。

這裏是nginx的配置文件從搬運工容器內的相關部分:

default.conf(包括來自nginx.conf):

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; 
    } 
} 

的/ etc/nginx的/ vhost.d/sub1.mydomain.com:

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的到t RY運行imageControl.php(我不使用php-fpm) - 我想nginx的將它傳遞給上游apache的容器。

期望的行爲例如:

  1. 這部分的工作原理

  2. 這部分不工作

我會很感激一些幫助。

回答

0

您可以使用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