1 votes

Règle de réécriture de nginx pour convertir les segments d'URL en paramètres de chaîne de requête

Je suis en train de mettre en place un serveur nginx pour la première fois, et j'ai quelques difficultés à obtenir les règles de réécriture correctes pour nginx.

Les règles Apache que nous avons utilisées sont les suivantes :

Regardez si c'est un vrai fichier ou répertoire, si oui, servez-le, puis envoyez toutes les requêtes de / à Director.php

DirectoryIndex Director.php

Si l'URL a un seul segment, passez-le en tant que rt

 RewriteRule ^/([a-zA-Z0-9\-\_]+)/$ /Director.php?rt=$1 [L,QSA]

Si l'URL a deux segments, passez-la en tant que rt y action

RewriteRule ^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$ /Director.php?rt=$1&action=$2 [L,QSA]

Mon fichier de configuration nginx ressemble à :

server {
...

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

location ~ \.php$ {
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      include        fastcgi_params;
   }
}

Comment puis-je obtenir les segments d'URL en paramètres de chaîne de requête comme dans les règles Apache ci-dessus ?

MISE À JOUR 1

J'essaie l'approche de Pothi :

# serve static files directly
location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|html)$ {
   access_log off;
   expires 30d;
}

location / {
   try_files $uri $uri/ /Director.php;
   rewrite "^/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1" last;
   rewrite "^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1&action=$2" last;
}

location ~ \.php$ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  index.php;
   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include        fastcgi_params;
}

Cela produit le résultat suivant No input file specified. à chaque demande. Je ne sais pas si le .php est déclenché (et ensuite transmis à php) lorsqu'une réécriture dans un bloc quelconque indique un fichier .php ou non.

MISE À JOUR 2

Je ne sais toujours pas comment configurer ces blocs de localisation et passer les paramètres.

location /([a-zA-Z0-9\-\_]+)/ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  index.php;
   fastcgi_param  SCRIPT_FILENAME  ${document_root}Director.php?rt=$1{$args};
   include        fastcgi_params;
}

MISE À JOUR 3

Il semble que la directive racine était manquante, ce qui a causé la No input file specified. message. Maintenant que cela est corrigé, j'obtiens le fichier d'index comme si l'URL était / sur chaque demande, quel que soit le nombre de segments d'URL.

Il semble que l'expression régulière de mon emplacement soit ignorée.

Ma configuration actuelle est la suivante :

# This location is ignored:
location /([a-zA-Z0-9\-\_]+)/ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  Director.php;
   set $args $query_string&rt=$1;
   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include        fastcgi_params;
}

location / {
   try_files $uri $uri/ /Director.php;
}

location ~ \.php$ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  Director.php;
   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include        fastcgi_params;
}

1voto

Pothi Kalimuthu Points 5514

Avis de non-responsabilité : Aucun des éléments suivants n'a été testé. Veuillez l'utiliser avec prudence. Si quelque chose ne va pas, veuillez activer le débogage comme indiqué à l'adresse suivante http://nginx.org/en/docs/debugging_log.html .

See if it's a real file or directory, if so, serve it,
then send all requests for / to Director.php

Cela peut être réalisé avec...

server {
  index Directory.php;
  location / {
    try_files $uri $uri/ /Directory.php;
  }
}

El index est suffisante pour l'index du répertoire. Pour envoyer toutes les requêtes à Director.php, le bloc de localisation est nécessaire.

If the URL has one segment, pass it as rt

Vous pouvez essayer ce qui suit...

rewrite "^/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1" last;

N'oubliez pas les guillemets autour des réécritures. Il est préférable d'utiliser des guillemets, et cela est nécessaire dans certaines conditions (cela est mentionné dans le lien fourni précédemment par @jerm).

If the URL has two segments, pass it as rt and action

Vous pouvez essayer ce qui suit...

rewrite "^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1&action=$2" last;

Veuillez noter que je n'ai rien fait pour QSA dans les exemples ci-dessus. Vous pouvez essayer $args dans Nginx pour passer la chaîne de requête existante à la nouvelle chaîne de requête. Réf : http://nginx.org/en/docs/http/ngx_http_core_module.html#variables

J'espère que cela vous aidera à trouver une solution complète et fonctionnelle !

0voto

jerm Points 637

Il s'agit d'une bonne introduction à la capture des regex en tant que variables dans les emplacements nginx.

http://nginx.org/en/docs/http/server_names.html#regex_names

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