2 votes

Comment réécrire une URL en utilisant NGINX pour cacher index.php dans plusieurs sous-dossiers qui changent fréquemment ?

Nous avons donc un serveur de développement PHP où chaque développeur dispose d'un sous-domaine personnel tel que https://dev-abc.mysite.com avec une configuration NGINX correspondante.

Les développeurs vérifient une branche de notre répertoire dans des dossiers comme celui-ci :

  • /var/www/html/dev-abc/branch-X
  • /var/www/html/dev-abc/branch-Y
  • /var/www/html/dev-abc/branch-Z

Modèle d'URL :
https://dev-abc.mysite.com/{BRANCH}/index.php/{MODULE}/{CLASSE}/?event={EVENT}&otherParamX=Y

{MODULE} est un dossier dans modules/
{CLASS} est un fichier de classe dans modules/{MODULE}
{EVENT} est une méthode à l'intérieur d'une classe à l'intérieur de modules/{MODULE}

L'accès aux branches se fait de la manière suivante : https://dev-abc.mysite.com/branch-X/index.php/report/invoice

Nous essayons simplement de réécrire l'URL en :
https://dev-abc.mysite.com/branch-X/report/invoice/

Pour tous les sous-répertoires sous leur sous-domaine.

Les configurations de NGINX ressemblent à ceci :

Trajectoire :
/etc/nginx/conf.d/dev-abc.conf

server {
        server_tokens off;

        listen 80;
        autoindex off;
        server_name dev-abc.mysite.com;
        root /var/www/html/dev-a;

        error_log /home/dev-abc/nginx-error.log notice;

        include /etc/nginx/includes/dev_sandbox;

        rewrite_log on;
}

Note : /etc/nginx/includes/dev_sandbox inclut beaucoup de choses pour les en-têtes et CORS, donc je ne le posterai pas à moins que ce soit nécessaire car il est long.

J'ai essayé ce qui suit :

Tentative 1 :

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

NGINX lance : ^(.+.php)(/.+)" ne correspond pas à "/index.php" Le navigateur affiche également "File not found" (fichier introuvable).

Tentative 2 :

location ~(.+)/(.+) {
    try_files $uri $1/index.php/$2;
}

Travaux :
https://dev-abc.mysite.com/branch-X/report/

Ne fonctionne pas :
https://dev-abc.mysite.com/branch-X/report/invoice/

Tentative 3 :

location ~(.+)/(.+)/(.+) {
    try_files $uri $1/control.php/$2/$3;
}

Travaux :
https://dev-abc.mysite.com/branch-X/report/invoice/

Ne fonctionne pas :
https://dev-abc.mysite.com/branch-X/report/

Lancers :
"/var/www/html/dev-abc/branch-X/report/index.php" est introuvable.

1voto

HugoFS Points 313

Les opérateurs de répétition comme * y + son avide . Ainsi, la première capture en (.+)/(.+) prend tout jusqu'à ce que le dernier / (avec au moins un caractère suivant). Ainsi, le comportement de votre Tentative 2 est tout à fait prévisible.

Vous pouvez utiliser les opérateurs de répétition paresseux à la place, comme par exemple *? y +? par exemple :

location ~ (.+?)/(.+) { ... }

Vous pouvez également utiliser une classe de caractères qui ne prend en compte que les caractères qui ne sont pas des / (en se rappelant que le premier caractère est toujours un / ), par exemple :

location ~ (/[^/]+)/(.+) { ... }

Bien que cela ne soit pas strictement nécessaire dans ce cas, vous devriez probablement ajouter ancres autour de l'expression, car vous souhaitez uniquement faire correspondre l'URI entier, par exemple :

location ~ ^(.+?)/(.+)$ { ... }

Ou bien :

location ~ ^(/[^/]+)/(.+)$ { ... }

Note importante

Les blocs de localisation des expressions régulières sont évalués dans l'ordre jusqu'à ce qu'une correspondance soit trouvée. Veillez à ce que vos location ^(.+.php)(/.+) apparaît en premier dans l'ordre, afin d'éviter une boucle de redirection.

0voto

WeaponX86 Points 33

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X