Comment puis-je avoir la même règle pour deux emplacements dans NGINX config?
J'ai essayé le suivant
server {
location /first/location/ | /second/location/ {
..
..
}
}
mais nginx reload a lancé cette erreur:
nginx: [emerg] invalid number of arguments in "location" directive**
Essayer
location ~ ^/(first/location|second/location)/ {
...
}
Le ~
signifie utiliser une expression régulière pour l'URL. Le ^
signifie vérifier à partir du premier caractère. Cela cherchera un /
suivi de l'un des emplacements, puis un autre /
.
Une autre option consiste à répéter les règles dans deux emplacements de préfixe à l'aide d'un fichier inclus. Étant donné que les emplacements de préfixes sont indépendants de la position dans la configuration, leur utilisation peut éviter une certaine confusion lorsque vous ajoutez ultérieurement d'autres emplacements d'expression régulière. En évitant les emplacements de regex lorsque vous le pourrez, votre configuration sera mise à l’échelle en douceur.
server {
location /first/location/ {
include shared.conf;
}
location /second/location/ {
include shared.conf;
}
}
Voici un exemple shared.conf:
default_type text/plain;
return 200 "http_user_agent: $http_user_agent
remote_addr: $remote_addr
remote_port: $remote_port
scheme: $scheme
nginx_version: $nginx_version
";
Les fichiers regex et les fichiers inclus sont de bonnes méthodes, et je les utilise fréquemment. Mais une autre alternative consiste à utiliser un "emplacement nommé", ce qui est une approche utile dans de nombreuses situations, notamment les plus compliquées. La page officielle "If is Evil" montre essentiellement ce qui suit comme un bon moyen de faire les choses:
error_page 418 = @common_location;
location /first/location/ {
return 418;
}
location /second/location/ {
return 418;
}
location @common_location {
# The common configuration...
}
Ces différentes approches présentent des avantages et des inconvénients. Un grand avantage d'une expression régulière est que vous pouvez capturer des parties de la correspondance et les utiliser pour modifier la réponse. Bien sûr, vous pouvez généralement obtenir des résultats similaires avec les autres approches en définissant une variable dans le bloc d'origine ou en utilisant map
. L’inconvénient de l’approche regex est qu’elle peut devenir difficile à manier si vous souhaitez faire correspondre plusieurs lieux, plus le priorité faible d’un regex risque de ne pas correspondre à la façon dont vous souhaitez faire correspondre les lieux - ne pas le faire mentionner qu’il existe apparemment des effets sur la performance de regex dans certains cas.
Le principal avantage de l'inclusion de fichiers (d'après ce que je peux en dire) est que le contenu de ce que vous pouvez inclure est un peu plus flexible - il n'est pas nécessaire qu'il s'agisse d'un bloc d'emplacement complet, par exemple. Mais c’est aussi un peu plus subjectivement subjectif que les lieux nommés.
Notez également qu’il existe une solution connexe que vous pourrez peut-être utiliser dans des situations similaires: emplacements imbriqués. L'idée est de commencer par un emplacement très général, d'appliquer une configuration commune à plusieurs correspondances possibles, puis d'avoir des emplacements imbriqués distincts pour les différents types de chemins que vous souhaitez faire correspondre. Par exemple, il pourrait être utile de faire quelque chose comme ceci:
location /specialpages/ {
# some config
location /specialpages/static/ {
try_files $uri $uri/ =404;
}
location /specialpages/dynamic/ {
proxy_pass http://127.0.0.1;
}
}
C'est une approche courte, efficace et éprouvée:
location ~ (patternOne|patternTwo){ #rules etc. }
Donc, on peut facilement avoir plusieurs modèles avec une syntaxe de tuyau simple pointant vers le même bloc/règles d'emplacement.