web-dev-qa-db-fra.com

Le sous-répertoire virtuel NGINX sert des fichiers PHP sous forme de téléchargements

Mon serveur répond aux chemins de sous-répertoires virtuels suivants:

www.domaine.fr/fr www.domaine.fr/ca www.domaine.fr/fr-ca www.domaine.fr/spa

Chacun de ces noms est un alias pour www.domain.com.

Si j'essaie d'accéder à www.domain.com/some/virtual/path, il est correctement transmis à mon index.php et traité par PHP-FPM.

Si je tente d'accéder à www.domain.com/s/some/virtual/path, il est correctement transmis à mon index.php et traité par PHP-FPM.

Toutefois, si j'essaie d'appeler www.domain.com/s/file.php, NGINX tente de transmettre le fichier en téléchargement. Mais sans le chemin virtuel, il est géré de manière appropriée par PHP-FOM.

Mes chemins de sous-répertoires virtuels sont gérés par cette section dans ma configuration NGINX:

    ####
    # Catch virtual locations: /us, /ca, /fr-ca, /spa
    ####
    location ~ ^\/(?:(?<currentSite>us|ca|fr-ca|spa)(?:\/|$))(?<realPath>.*) {
        try_files /$realPath /$realPath/;
        break;
    }

.

server {
    listen       443 ssl;
    listen       80;
    listen   [::]:80 default ipv6only=on;
    server_name  localhost;

    ssl_certificate      /certs/cert.pem;
    ssl_certificate_key  /certs/cert.key;

    root   ${LANDO_WEBROOT};
    index index.php index.html index.htm;

    ######
    # CloudFlare limit for headers is 8K - development should simulate this

    large_client_header_buffers 4 8k;

    ####
    # Catch virtual locations: /us, /ca, /fr-ca, /spa
    ####
    location ~ ^\/(?:(?<currentSite>us|ca|fr-ca|spa)(?:\/|$))(?<realPath>.*) {
        try_files /$realPath /$realPath/;
        break;
    }

    ####
    # Manage the REAL locations
    ####
    location /js {
        index index.html
        expires 100d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri $uri/ =404;
        break;
    }

    location /media {
        index index.html
        expires 100d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri $uri/ =404;
        break;
    }

    location /skin {
        index index.html
        expires 100d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri $uri/ =404;
        break;
    }

    location @handler {
        rewrite / /index.php;
    }

    location / {
        try_files $uri $uri/ @handler;
    }

    location ~ \.php$ {
        # Try to load the file if requested, if not found, rewrite to @missing
        # This should pass all requests through index.php

        try_files $uri =404;

        fastcgi_param MAGE_IS_DEVELOPER_MODE true;
        fastcgi_buffers 256 500k; #Allow a greater amount of data to be included in cookies
        fastcgi_buffer_size 1000k;  #Allow a greater amount of data to be included in cookies

        fastcgi_pass fpm:9000;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_connect_timeout 300s;
        fastcgi_send_timeout 300s;
        fastcgi_read_timeout 300s;
        include fastcgi_params;
    }
}
1
TylersSN

Vous pouvez utiliser un rewrite...last pour supprimer le préfixe de langue de l'URI, afin qu'il puisse être traité correctement par les emplacements restants de votre configuration. En particulier, les .php URI doivent être traités par le bloc location ~ \.php$.

Par exemple:

location ~ ^/(?:(?<currentSite>us|ca|fr-ca|spa)(?:/|$))(?<realPath>.*) {
    rewrite ^ /$realPath last;
}

Ou plus simplement:

rewrite ^/(us|ca|fr-ca|spa)(?:/(.*))? /$1 last;

Voir ce document pour plus de détails.

1
Richard Smith