Comment configurer nginx en try_files en premier, s’il n’existe pas, suivez le request_uri

Nous avons des caches de page avec un partitionnement et un sous-domaine id. Dites pour les demandes comme ny.site.com/cat/12345 ou la.site.com/dog/234 , nginx doit

  1. vérifiez si le fichier /cat/ny/1234/5.html existe, renvoyez-le
  2. sinon, il suffit d’utiliser l’original request_uri pour request_uri au serveur d’applications et le fichier cache sera créé

Nous avons réussi à comprendre la partie partitionnement de sous-domaines et d’ID, mais nous n’avons pas eu de chance sur la partie try_files. Toujours obtenir des erreurs de boucle indéfinies comme la rewrite or internal redirection cycle while internally redirecting to

notre fichier nginx.conf est comme

 rewrite "/cat/([0-9]{4})([0-9]{1,4})" /system/cache/cat/$subdomain/$1/$2.html break; rewrite "/cat/([0-9]{1,4})" /system/cache/cat/$subdomain/$1.html break; try_files $uri $request_uri; 

Des indices? Merci!

MISE À JOUR: J’ai essayé ce qui suit. Nginx cherchait $ request_uri (par exemple, / cat / 12345) dans le système de fichiers au lieu de toucher le serveur d’applications. Des pensées?

 try_files $uri @old; location @old { rewrite ^ $request_uri break; } 

Essayez avec ceci

 location ^~ ^/cat/([0-9]{4})([0-9]{1,4}) { try_files "/cat/ny/$1/$2.html" @app_server; } location @app_server{ # pass this to your app server for processing. } 
  1. Utilisez ^ ~ car cela inclura aussi le cas de bord comme / cat / 12345 / (barre oblique de fin).
  2. Et assurez-vous simplement que vous voulez $ uri (qui est sans chaîne de requête) ou $ request_uri (qui contient la chaîne de requête).

Je n’ai jamais essayé ça moi-même avant mais c’est comme ça que je l’écrirais

 location / { # or whatever location you see fit to your requirements try_files $uri.html $uri; # I don't know if the `.` needs to be escaped `$uri\.html`, you can try both }