Cómo servir a todos los archivos estáticos existentes directamente con Nginx, pero el resto de proxy a un servidor back-end.

StackOverflow https://stackoverflow.com/questions/869001

Pregunta

location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    if (-f $request_filename) {
        access_log off;
        expires 30d;
        break;
        }

    if (!-f $request_filename) {
        proxy_pass http://127.0.0.1:8080; # backend server listening
        break;
        }
    }

Sobre servirá todos los archivos existentes que usan directamente Nginx (por ejemplo Nginx sólo muestra el código fuente PHP), de lo contrario presentar una solicitud a Apache. Necesito excluir archivos * .php de la regla de modo que las solicitudes de * .php también se pasan a Apache y procesados.

Quiero Nginx para manejar todos los archivos estáticos y Apache para procesar toda la materia dinámica.

EDIT:. Hay enfoque de lista blanca, pero no es muy elegante, Ver todas esas extensiones, yo no quiero esto

location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
    access_log off;
    expires 30d;
    }
location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
    }

EDIT 2: En las versiones más nuevas de uso Nginx try_files lugar http://wiki.nginx.org / HttpCoreModule # try_files

¿Fue útil?

Solución

try_files y el bloque de ubicación con nombre ( '@apachesite'). Esto eliminará partido de expresiones regulares innecesario y si el bloque. Más eficiente.

location / {
    root /path/to/root/of/static/files;
    try_files $uri $uri/ @apachesite;

    expires max;
    access_log off;
}

location @apachesite {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

Actualización: El supuesto de esta configuración es que no existe ningún script PHP bajo /path/to/root/of/static/files. Esto es común en la mayoría de los marcos de PHP modernas. En caso de que sus proyectos php heredadas tienen ambos scripts php y archivos estáticos mezclados en la misma carpeta, que pueden tener a la lista blanca todos los tipos de archivos que desea nginx para servir.

Otros consejos

Prueba esto:

location / {
    root /path/to/root;
    expires 30d;
    access_log off;
}

location ~* ^.*\.php$ {
    if (!-f $request_filename) {
        return 404;
    }
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

Es de esperar que funciona. Las expresiones regulares tienen mayor prioridad que las cadenas de fricción, por lo que todas las solicitudes que terminan en .php deben forwared a Apache aunque sólo sea un correspondiente <=> archivo existe. Resto se maneja como archivos estáticos. El algoritmo real de evaluar ubicación es rel="noreferrer"> .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top