2017-02-04 4 views
1

Я хотел бы вставить несколько выделенных маршрутов внутри сайта в определенные каталоги, которые могут иметь не одно и то же имя. Я не могу понять, как переписать путь, который он использует для try_files.Nginx вложенное местоположение с переадресацией маршрута

server {   
    listen 80 default_server; 
    listen [::]:80 default_server; 

    root /var/www/default; 

    index index.html; 

    server_name _; 

    if ($bad_referer) { 
     return 444; 
    } 

    location/{ 
     try_files $uri $uri/ =404; 
    } 

    location /postfixadmin/ { 
     access_log /var/log/nginx/postfixadmin/access.log; 
     error_log /var/log/nginx/postfixadmin/error.log; 

     root /var/www/postfixadmin/; 
     index index.php index.html index.htm; 
     try_files $uri $uri/ /index.php; 


     location ~ \.php$ { 
      include fastcgi.conf; 
      fastcgi_index index.php; 
      fastcgi_intercept_errors on; 
      fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
     } 

     location ~* \.(css|js|gif|jpe?g|png|woff|woff2|ttf|eot|svg|ico)$ { 
      expires 168h; 
      add_header Pragma public; 
      add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
     } 
    } 

    location /email/ { 

     #access_log /var/log/nginx/roundcube/access.log; 
     #error_log /var/log/nginx/roundcube/error.log; 

     root /var/www/roundcube/; 
     index index.php index.html index.htm; 
     try_files $uri $uri/ /index.php; 

     location ~ \.php$ { 
      include fastcgi.conf; 
      fastcgi_index index.php; 
      fastcgi_intercept_errors on; 
      fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
     } 

     location ~* \.(css|js|gif|jpe?g|png|woff|woff2|ttf|eot|svg|ico)$ { 
      expires 168h; 
      add_header Pragma public; 
      add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
     } 
    } 
} 

Когда я перейти к www.site.com/email, я получаю 404, и я предполагаю, что это потому, что он ищет /var/www/roundcube/email/index.php, который не существует. Что мне нужно сделать, чтобы переписать путь к файлу до try_files?

+0

Вы можете использовать корневые или псевдоним директивы сказать NGINX, где искать. –

ответ

1

Я выяснил решение, и это оказалось довольно простым. Использование alias, а не root использует только раздел строки после части, соответствующей location, поэтому я искал в нужном каталоге. Другая проблема заключалась в том, что PHP не получал правильное имя сценария, поэтому он все еще искал не то место. Решение должно было пройти в fastcgi_param SCRIPT_FILENAME $request_filename;. Мне также удалось избавиться от раздела try_files, хотя я не на 100% уверен, почему.

Вот рабочие решения:

server {   
    listen 80 default_server; 
    listen [::]:80 default_server; 

    root /var/www/default; 

    index index.html; 

    server_name _; 

    if ($bad_referer) { 
     return 444; 
    } 

    try_files $uri $uri/ =404; 

    location /postfixadmin { 
     alias /var/www/postfixadmin/; 
     index index.php index.html index.htm; 

     location ~ /postfixadmin/.+\.php$ { 
      include fastcgi.conf; 
      fastcgi_index index.php; 
      fastcgi_intercept_errors on; 
      fastcgi_param SCRIPT_FILENAME $request_filename; 
      fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
     } 

     location ~* \.(css|js|gif|jpe?g|png|woff|woff2|ttf|eot|svg|ico)$ { 
      expires 168h; 
      add_header Pragma public; 
      add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
     } 
    } 

    location /email { 
     alias /var/www/roundcube/; 
     index index.php index.html index.htm; 

     location ~ /email/.+\.php$ { 
      include fastcgi.conf; 
      fastcgi_index index.php; 
      fastcgi_intercept_errors on; 
      fastcgi_param SCRIPT_FILENAME $request_filename; 
      fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
     } 

     location ~* \.(css|js|gif|jpe?g|png|woff|woff2|ttf|eot|svg|ico)$ { 
      expires 168h; 
      add_header Pragma public; 
      add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
     } 
    } 
}