Question Comment faire pour supprimer le bloc d'emplacement de $ uri dans la configuration nginx?


J'ai une réécriture dans mon fichier de configuration ngix qui fonctionne correctement, sauf qu'il semble inclure le bloc d'emplacement dans 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;
}

En utilisant un exemple d'URL de http://localhost/cargo/testpage la redirection fonctionne, cependant la valeur du paramètre "_REWRITE_COMMAND" reçu par mon fichier php est "/ cargo / testpage". J'ai besoin de dépouiller le bloc d'emplacement et juste avoir "testpage" comme $ uri

Je suis à peu près sûr qu'il existe une syntaxe regex pour scinder le $ uri et l'assigner à une nouvelle variable à l'aide de $ 1 $ 2 etc., mais je ne trouve aucun exemple permettant d'effectuer une affectation de variable utilisant une regex ne faisant pas partie d'une réécriture. déclaration. Je cherche et j'essaye depuis des heures et je n'arrive pas à passer cette dernière étape.

Je sais aussi que je pourrais simplement supprimer cela du code de l'application, mais la raison pour laquelle je veux essayer de le réparer dans la configuration de nginx est pour des raisons de compatibilité, car il fonctionne également sur Apache. Je devrais également dire que j’ai trouvé une façon très astucieuse de le faire, mais cela implique une déclaration "if" pour vérifier l’existence du fichier et la documentation précise ne pas pour le faire de cette façon.


12
2017-12-06 18:47


origine




Réponses:


En regardant autour de moi, 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;
}

13
2017-12-06 21:53



aha, si simple une fois que quelqu'un vous le fait remarquer! J'ai dû faire quelques révisions mineures pour gérer la réécriture de l'URL racine au bon endroit. Je pose la réponse dans la question car je ne peux pas formater dans ce commentaire. Le seul inconvénient qui reste est que le bloc php doit maintenant se situer au-dessus de ce bloc d’emplacement ou une boucle de redirection infinie est créée (car / cargo est une expression rationnelle et l’URL de redirection contient également / cargo). Vous ne savez pas s'il existe un autre moyen d'éviter cela? - Jason
Je recommande de lire sur la commande des emplacements regexp et non regexp. Je fais habituellement en sorte que tous les emplacements soient regexp à un moment donné, car l'ordre est 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 ferait mieux la regex dessus s’il correspond / cargo / (tout sauf index.php), ce qui éviterait une erreur du serveur due à une boucle de réécriture infinie. - Jason


J'ai trouvé autre chose qui a fonctionné pour moi (car j'utilise gunicorn, je ne peux pas choisir quoi passer)

Vous devriez pouvoir vous en sortir

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

2
2018-04-10 19:09