2013-07-02 14 views
15

Mam następujące nginx config:nginx podścieżki karnetów proxy nie przekierowany

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

z:

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

Tak, chciałbym przekierować wszystkie żądania z/mail na serwerze backend roundcube.

Ale tylko żądanie pasujące do /mail jest przekierowywane. Tak więc, /mail/plugins, itp. ... nie są przekierowywane, co oznacza, że ​​nie mam żadnych CSS lub JS, itp., Ponieważ nginx próbuje je znaleźć lokalnie.

Jak mogę poprawnie przekierować wszystkie ścieżki?

Oto moja kompletna konfiguracja nginx. Frontend jest własnością prywatną.

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

Odpowiedz

5

try:

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

przykro. To nie działa. –

+0

Edytowałem moje pytanie z pełną konfiguracją. –

+1

OK, znalazłem to. To tylko kolejność, którą trzeba było zmienić. –

35

Odniesienia do docs nginx: HttpCoreModule#location, HttpProxyModule#proxy_pass.

Jest lepszy sposób niż użycie wyrażenia regularnego (które jest wolne) dla dopasowania lokalizacji. W takim przypadku możesz użyć polecenia ^~, aby poinformować nginx, aby dopasował dany prefiks /mail przed wykonaniem jakiegokolwiek dopasowania do wyrażenia regularnego. Nie potrzebujesz też tej reguły przepisywania, ponieważ proxy_pass może sam dokonać prostego przepisywania (dodając końcowy ukośnik / w adresie URL serwera wyższego rzędu).

Moja sugestia jest zastąpienie

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

przez

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

Działa dobrze. Dziękuję Ci. –

+0

Spędziłem około 1 godziny, aby znaleźć to rozwiązanie ... Wielkie dzięki! –

+0

Genialny !!! tego właśnie szukałem dzięki człowieku, spędziłem kilka dobrych godzin próbując to zrozumieć. – Alex

Powiązane problemy