2013-07-02 15 views
15

Ho la seguente configurazione nginx:nginx sottotracciati passa proxy non reindirizzati

location /mail { 
      rewrite   ^/mail/(.*) /$1 break; 
      proxy_pass https://roundcube-host; 
      proxy_connect_timeout 1; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header Host $http_host; 
      proxy_set_header X-Forwarded-Proto https; 
    } 

con:

upstream roundcube-host { 
      server roundcube-ip-address:443; 
    } 

Quindi, vorrei reindirizzare tutte le richieste da/posta a un server back-end Roundcube.

Tuttavia, solo la richiesta corrispondente a /mail viene reindirizzata. Quindi, /mail/plugins, ecc ... non vengono reindirizzati, il che significa che non ho alcun CSS o JS, ecc. Perché nginx sta cercando di trovarli localmente.

Come posso reindirizzare correttamente tutti i percorsi?

Ecco la mia configurazione completa di nginx. Il frontend è in proprio.

upstream phpcgi { 
    fair; 
    server 127.0.0.1:9000; 
    server 127.0.0.1:9001; 
    keepalive 5; 
} 

upstream roundcube-host { 
    server roundcube-ip-address:443; 
} 

server { 
    listen 443 ssl; 
    #server_name cloud.example.com; 

    ssl_certificate /etc/ssl/certs/owncloud.crt; 
    ssl_certificate_key /etc/ssl/private/owncloud.key; 

    access_log /var/log/nginx/data_access.log; 
    error_log /var/log/nginx/data_error.log info; 

    # Path to the root of your installation 
    root /var/www/; 

    client_max_body_size 10G; # set max upload size 
    fastcgi_buffers 64 4K; 

    rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect; 
    rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect; 
    rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect; 

    index index.php; 
    error_page 403 = /core/templates/403.php; 
    error_page 404 = /core/templates/404.php; 

    location = /robots.txt { 
     allow all; 
     log_not_found off; 
     access_log off; 
    } 

    location ~ ^/(data|config|\.ht|db_structure\.xml|README) { 
      deny all; 
    } 

    location/{ 
      # The following 2 rules are only needed with webfinger 
      rewrite ^/.well-known/host-meta /public.php?service=host-meta last; 
      rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last; 

      rewrite ^/.well-known/carddav /remote.php/carddav/ redirect; 
      rewrite ^/.well-known/caldav /remote.php/caldav/ redirect; 

      rewrite ^(/core/doc/[^\/]+/)$ $1/index.html; 

      try_files $uri $uri/ index.php; 
    } 

    location ~ ^(.+?\.php)(/.*)?$ { 
      try_files $1 = 404; 

      include fastcgi_params; 
      fastcgi_param SCRIPT_FILENAME $document_root$1; 
      fastcgi_param PATH_INFO $2; 
      fastcgi_param HTTPS on; 
      fastcgi_pass phpcgi; 
      # Or use unix-socket with 'fastcgi_pass unix:/var/run/php5-fpm.sock;' 
      fastcgi_param MOD_X_ACCEL_REDIRECT_ENABLED on; 
    } 

    # Optional: set long EXPIRES header on static assets 
    location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ { 
      expires 30d; 
      # Optional: Don't log access to assets 
      access_log off; 
    } 

    # Change the path according to the data directory 
    location ~ ^/var/data { 
      internal; 
      root /; 
    } 

    location ~ ^/tmp/oc-noclean/.+$ { 
      internal; 
      root /; 
    } 

    location ~ ^/mail(.*)$ { 
      rewrite   ^/mail/(.*) /$1 break; 
      proxy_pass https://roundcube-host; 
      proxy_connect_timeout 1; 
      proxy_set_header  Host    $http_host; 
      proxy_set_header  X-Real-IP   $remote_addr; 
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header  X-Forwarded-Proto $https; 
    } 
} 

risposta

5

prova:

location ~ ^/mail(.*)$ { 
      rewrite   ^/mail/(.*) /$1 break; 
      proxy_pass https://roundcube-host; 
      proxy_connect_timeout 1; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header Host $http_host; 
      proxy_set_header X-Forwarded-Proto https; 
    } 
+1

spiacenti. Non funziona. –

+0

Ho modificato la mia domanda con la configurazione completa. –

+1

Ok, l'ho trovato. È solo l'ordine di localizzazione che doveva essere cambiato. –

35

riferimenti ai documenti nginx: HttpCoreModule#location, HttpProxyModule#proxy_pass.

C'è un modo migliore di usare regex (che è lento) per la corrispondenza della posizione. In questo caso, è possibile utilizzare ^~ per comunicare a nginx il prefisso /mail prima di eseguire una corrispondenza regolare. Inoltre, non è necessaria la regola di riscrittura perché proxy_pass può eseguire tale semplice riscrittura autonomamente (aggiungendo una barra finale / nell'URL del server di origine).

Il mio suggerimento è quello di sostituire

location ~ ^/mail(.*)$ { 
     rewrite   ^/mail/(.*) /$1 break; 
     proxy_pass https://roundcube-host; 

da

location ^~ /mail { 
     proxy_pass https://roundcube-host/; 
+0

Funziona bene. grazie. –

+0

Ho trascorso circa 1 ora per trovare questa soluzione ... Grazie mille! –

+0

Brillante !!! questo è quello che stavo cercando grazie amico, ho passato un buon paio di ore cercando di capirlo. – Alex

Problemi correlati