2013-07-02 19 views
15

Aşağıdaki nginx yapılandırma vardır:nginx vekil geçiren alt yol yönlendirilmemesidir

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

ile:

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

Yani, bir arka uç roundcube sunucusuna/postadan tüm istekleri yönlendirmek istiyoruz.

Ancak, yalnızca /mail ile eşleşen istek yeniden yönlendirilir. Yani, /mail/plugins, vb ... nginx yerel olarak bulmaya çalışırken, herhangi bir CSS veya JS, vb. Olmadığı anlamına gelir.

Tüm yolların doğru bir şekilde yönlendirilmesini nasıl sağlayabilirim?

İşte tam nginx yapılandırm. Ön cephesi kendine ait.

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

cevap

5

deneyin: nginx dokümanlara

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

tarafından

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

değiştirmektir. Çalışmıyor. –

+0

Sorumu eksiksiz bir yapılandırma ile düzenledim. –

+1

Tamam, onu buldum. Sadece değiştirilmesi gereken yer sırası. –

35

Referanslar: HttpCoreModule#location, HttpProxyModule#proxy_pass.

Konum eşlemesi için normal ifadelerden (yavaş olan) daha iyi bir yol var. Bu durumda, ^~ nginx'i herhangi bir regex eşleşmesi yapmadan önce belirtilen önekle /mail eşleşmesi için kullanabilirsiniz. Ayrıca, bu yeniden yazma kuralına da ihtiyacınız yoktur, çünkü proxy_pass, bu basit yeniden yazmayı kendi başına yapabilir (üst akışlı sunucu URL'sine / numaralı bir ek çizgi ekleyerek).

Benim önerim Maalesef

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

İyi çalışıyor. teşekkür ederim. –

+0

Bu çözümü bulmak için yaklaşık 1 saat harcadım ... Çok teşekkürler! –

+0

Brilliant !!! Ben bu adam için aradığım şey bu, bunu anlamaya çalışmak için birkaç saat harcadım. – Alex