comment supprimer le bloc d'emplacement de $ uri dans la configuration nginx?


16

J'ai une réécriture dans mon fichier de configuration ngix qui fonctionne correctement, sauf qu'il semble inclure le bloc d'emplacement dans le cadre de la variable $ uri. Je veux seulement le chemin après le bloc d'emplacement. Mon code de configuration actuel est:

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

L'utilisation d'un exemple d'URL de http://localhost/cargo/testpagela redirection fonctionne, mais la valeur du paramètre "_REWRITE_COMMAND" reçue par mon fichier php est "/ cargo / testpage". J'ai besoin de supprimer le bloc d'emplacement et d'avoir juste "testpage" comme $ uri

Je suis à peu près sûr qu'il existe une syntaxe d'expression régulière pour diviser le $ uri et l'assigner à une nouvelle variable en utilisant $ 1 $ 2, etc., mais je ne trouve aucun exemple pour faire juste une affectation de variable en utilisant une expression régulière qui ne fait pas partie d'une réécriture déclaration. Je regarde et j'essaye depuis des heures et je n'arrive pas à passer cette dernière étape.

Je sais également que je pourrais simplement supprimer cela sur le code de l'application, mais la raison pour laquelle je veux essayer de le corriger dans la conf nginx est pour des raisons de compatibilité car il fonctionne également sur Apache. Je dois également dire que j'ai trouvé un moyen vraiment hacky de le faire, mais cela implique une instruction "if" pour vérifier l'existence du fichier et la documentation dit spécifiquement de ne pas le faire de cette façon.

Réponses:


18

En regardant autour, je suppose que l'utilisation d'un emplacement d'expression rationnelle avec des captures est la plus simple. En adaptant votre exemple, je me retrouve avec:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}

aha, si simple une fois que quelqu'un vous l'a fait remarquer! J'ai dû faire quelques révisions mineures pour gérer la réécriture de l'URL racine à l'emplacement correct. J'ai mis la réponse dans la question car je ne peux pas faire de mise en forme dans ce commentaire. La seule mise en garde est que le bloc php doit maintenant être au-dessus de ce bloc d'emplacement ou bien une boucle de redirection infinie est créée (car / cargo est une expression régulière et l'url de redirection contient également / cargo). vous ne savez pas s'il existe un autre moyen d'empêcher que cela se produise?
Jason

Je recommande de lire sur la commande des emplacements regexp et non regexp. Je me tourne généralement vers la regexp de tous les emplacements à un moment donné, car l'ordre est alors déterminé par l'ordre dans le fichier de configuration au lieu de la spécificité de la correspondance.
Theuni

cool merci, j'imaginais ce qui rendrait la regex ci-dessus meilleure si elle correspond à / cargo / (quoi que ce soit sauf index.php) alors cela empêcherait une erreur de serveur due à une boucle de réécriture infinie.
Jason

3

J'ai trouvé une autre chose qui fonctionnait pour moi (comme j'utilise du gunicorn, je ne peux pas choisir quoi passer)

Vous devriez pouvoir vous en sortir avec

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

1

Pour ceux qui pourraient avoir du mal à l'ajouter pour le micro service ou l'API avec Node JS, j'ai utilisé ce qui suit pour supprimer apide l'URL sur mon serveur:

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.