2016-07-22 1 views
1

J'essaie de comprendre pourquoi le préfixe / ne permet pas à la directive \.php$ de repérer le script. Ci-dessous un exemple de fichier .conf que j'utilise pour nginx.

Nous exécutons le code API, versionné dans le chemin: //domian.com/v#.#/endpoint/uri

Notre racine_document est un répertoire sous le numéro de version; index.php existe dans le répertoire version: path/to/sites/public/v1.0/index.php

index index.php # <-- this is in here globally 
location ~ ^/(?<version>v[\d\.]+) { 
    try_files $uri $version/index.php?$args; 
    # Why does this NOT work? The/stopping \.php$ from matching 
    # try_files $uri /$version/index.php?$args; 
} 

location ~ \.php$ { 

    fastcgi_pass php56; 
    fastcgi_index index.php; 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include fastcgi_params; 
    [...] 
} 

J'ai essayé toutes sortes de choses, mais ne peut pas sembler obtenir ce travail. Une fois que je retire la / cela fonctionne comme prévu, mais ma ligne SCRIPT_FILENAME passe de:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

Pour:

fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; 

Et ce casse le fichier PHP direct - quelque chose que je ne veux pas.

Édition: Solution: Répondu ci-dessous: Le problème concernait l'ordre de correspondance. La correspondance de modèle est d'abord trouvée, pas la dernière découverte.

Changement de leur ordre travaillé. Il a échoué le premier try_files parce que le modèle recherchait explicitement à partir de /.

Je lisais: http://nginx.org/en/docs/http/request_processing.html

Une demande « index.php » est également abondés par l'emplacement du préfixe «/» d'abord, puis par l'expression régulière « (php) $. ». Par conséquent, il est géré par ce dernier emplacement et la demande est transmise à un serveur FastCGI en écoute sur localhost: 9000.

+0

Avez-vous essayé 'index index.php' dans votre première section' location'? – miken32

+0

Ou, juste dans votre section 'http' serait mieux. – miken32

+0

Ne fonctionne pas. J'ai une directive globale 'index'. J'en ai ajouté un ici, et non-go-soit. Nginx récupère le fichier '/ v1.0/index.php' en tant que fichier statique et l'affiche directement (j'ai ajouté' default_type text/plain' globalement pour éviter le téléchargement par défaut de l'application/oct ... stream). – guice

Répondre

1

La première chose à noter est que les emplacements sont évalués regex dans l'ordre des fichiers, donc si /v1.1 correspond au premier bloc d'emplacement, puis /v1.1/index.php correspondra également le premier bloc d'emplacement. Vous semblez résoudre le problème de la mauvaise façon en créant de mauvaises URI avec un début manquant /. Pour plus de détails, voir this document pour plus de détails.

Vous devez placer votre bloc location ~ \.php$avant votre location ~ ^/(?<version>v[\d\.]+) bloc afin de permettre .php des fichiers avec le préfixe de version à traiter par le bloc PHP.

+0

Eh bien, je serai damné.C'était ça. Merci! Je pensais que c'était un modèle "surchargé" (dernier dans les règles): "Une requête" /index.php "est également appariée par l'emplacement du préfixe"/"d'abord, puis par l'expression régulière" \. (Php) $ Par conséquent, il est géré par ce dernier emplacement et la demande est transmise à un serveur FastCGI en écoute sur localhost: 9000 "- http://nginx.org/fr/docs/http/request_processing.html – guice