J’écris un simple CMS en PHP. Les pages (fichiers de démarques) et les images sont accessibles comme ceci (respectivement):
example.org/?q=about.md example.org/?i=photo.jpg
Éventuellement, j’aimerais utiliser des URL propres avec Nginx, pour que les mêmes requêtes ressemblent à ceci:
example.org/about example.org/photo.jpg
Je préfère utiliser try_files
que if
et rewrite
mais après avoir expérimenté pendant des heures, je ne peux pas le faire fonctionner.
location / { try_files $uri $uri/ /?q=$uri.md =404; } location ~ \.(gif|jpg|png)$ { try_files $uri /?i=$uri =404; }
Je ne comprends pas pourquoi le code ci-dessus ne fonctionne pas (les URL avec des arguments fonctionnent bien mais les jolies donnent 404 erreurs).
Y a-t-il un problème avec le passage du nom du dossier en tant qu’argument utilisant $uri
?
Dois-je échapper à des personnages bizarres (hormis mon propriétaire)?
Pour être complet, j’utilise Nginx 1.6.2, en utilisant le standard nginx.conf. Voici le rest de mon bloc de serveur:
server_name example.org; root /srv/example/; index index.html index.htm index.php; (...) location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi.conf; }
et fastcgi.conf est également standard.
J’ai pu faire fonctionner votre exemple en omettant simplement le =404
:
location / { try_files $uri $uri/ /?q=$uri.md; } location ~ \.(gif|jpg|png)$ { try_files $uri /?i=$uri; }
Citant le manuel :
Vérifie l’existence des fichiers dans l’ordre spécifié et utilise le premier fichier trouvé pour le traitement des demandes. […] Si aucun fichier n’a été trouvé , une redirection interne vers l’
uri
spécifiée dans le dernier paramètre est effectuée.
Vous voulez que cette redirection interne, qui ne se produit que si aucun des fichiers ne sont trouvés, mais que =404
soit toujours trouvé.