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;
}