Apache Mod_Rewrite: inclut les réécritures dynamics avec une variable basée sur la date

Il y a quelques appels d’api dans mon application que je veux réécrire en fichiers .json statiques (cache).

Mon site est destiné aux événements musicaux et les appels api que je veux réécrire en cache sont ceux des 7 prochains jours , donc 7 URL à redirect.

Ainsi, les URL ressembleront à ceci:

 api.domain.com/?date=2013-12-01 -> cache_2013_12_01.json api.domain.com/?date=2013-12-02 -> cache_2013_12_02.json api.domain.com/?date=2013-12-03 -> cache_2013_12_03.json api.domain.com/?date=2013-12-04 -> cache_2013_12_04.json api.domain.com/?date=2013-12-05 -> cache_2013_12_05.json api.domain.com/?date=2013-12-06 -> cache_2013_12_06.json api.domain.com/?date=2013-12-07 -> cache_2013_12_07.json 

Mais je ne voudrais pas redirect les dates ultérieures

 api.domain.com/?date=2013-12-08 -> doesn't redirect 

Est-il possible de créer ces redirections sans réécrire chaque jour mon fichier .htaccess avec php?

Merci

Je ne pense pas que .htaccess puisse le faire. mais réécrire .htaccess avec php est un peu dangereux.

Je pense que vous pouvez simplement créer un dossier de fichiers json, egjsondir, et faire php re-remplir ce dossier chaque jour avec seulement 7 fichiers. et ajoutez ceci au fichier .htaccess:

 RewriteCond %{HTTP_HOST} ^api.domain.com$ RewriteCond %{QUERY_STRING} date=(\d{4})-(\d{2})-(\d{2}) RewriteRule ^$ jsondir/cache_%1_%2_%3.json [L] 

Le mieux que j’ai pu trouver est de vérifier si le fichier en cache existe: je voudrais quand même pouvoir créer une condition qui ne correspond qu’aux sept prochains jours car cela semble un peu inutile de vérifier si le fichier existe pour un jour de cache de 8 semaines dans le futur lorsque le cache ne fait que passer 8 jours …

 RewriteCond %{HTTP_HOST} ^api. RewriteCond %{QUERY_STRING} ^date=(\d{4})-(\d{2})-(\d{2})$ RewriteCond %{DOCUMENT_ROOT}/cache/%1.json -f [OR] RewriteCond %{DOCUMENT_ROOT}/cache/%1.json -d RewriteRule ^(.*)$ cache/%1.json [L] 

Tout d’abord, je pense que l’approche d’Andrew est essentiellement correcte, que ce serait la bonne façon de s’y prendre, et vous avez tort de lui reprocher d’avoir essayé de vous montrer des approches alternatives. En outre, ce sera un peu une réponse intelligente, car la méthode que je vais décrire n’est pas vraiment préférable, juste intéressante. Mais j’aime évangéliser le fait que mod_rewrite est en fait un langage Turing-complet, capable de faire beaucoup plus que ce que les gens lui atsortingbuent.

De toute façon. La vraie question est: mod_rewrite peut-il fonctionner avec des dates? Cela peut très bien: Apache expose des informations sur l’heure et la date actuelles via plusieurs variables d’environnement: %{TIME} , %{TIME_DAY} , %{TIME_MON} et %{TIME_YEAR} peuvent tous être intégrés à RewriteConds pour obtenir des effets nets . Nous pourrions, par exemple, ne servir que des fichiers des années précédentes:

 RewriteCond %{QUERY_STRING} date=(\d{4})-(\d{2})-(\d{2}) RewriteCond %{TIME_YEAR} < %4 

Malheureusement, mod_rewrite n'offre aucun moyen de faire de l'arithmétique (nous pourrions en fait faire de l'arithmétique avec mod_rewrite seul. Nous pourrions, mais nous ne le voudrions pas!), Donc nous semblons être coincés ici.

Cependant, mod_rewrite a un mécanisme intéressant pour étendre le langage: grâce à RewriteMap , nous pouvons définir des programmes de réécriture externes que nous pouvons utiliser comme fonctions dans les réécritures. Ecrire un programme "soustraire sept jours de la date actuelle" serait sortingvial, donc on pourrait dire

 RewriteMap sub7day prg:subtract_7_days.py RewriteCond %{QUERY_STRING} date=(\d{4}-\d{2}-\d{2}) RewriteCond ${sub7days:%1} -lt %{TIME} 

En bref: il est parfaitement possible d'utiliser RewriteMap (en utilisant la puissance expressive d'un langage côté serveur), même réalisable.

Cela dit, je le ferais personnellement en PHP, comme ceci:

 RewriteCond %{QUERY_STRING} date=(\d{4}-\d{2}-\d{2}) RewriteRule .* cache_serve.php?date=%0 

Ensuite, je pourrais trouver la logique en PHP, qui est beaucoup moins frustrante que de travailler avec mod_rewrite, et beaucoup moins sujette aux erreurs.