Nginx clean urls, comment réécrire un dossier en argument avec try_files

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é.