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