nginx si l'instruction à l'intérieur de l'emplacement renvoie 404

11

Le bloc suivant

location / {
    if ($http_origin ~* (https?://[^/]*\.example\.com(:[0-9]+)?)) {
        add_header 'Access-Control-Allow-Origin' "$http_origin";
    }
    try_files $uri $uri/ /index.php?$args;
}

… Provoque un 404 car le code ci-dessus n'atteint jamais la try_filesdirective, donc:

  1. Est-ce lié au IfIsEvil de nginx?

  2. Si c'est le cas, existe-t-il un autre moyen de tester le http_originen n'utilisant pas une instruction if?

J'ai essayé cela avec nginx> 1.4 (1.4.6, 1.7, 1.7.8).

Spyros Lambrinidis
la source
1) C'est exactement à partir d'exemples «si c'est mal». 2) Vous pouvez utiliser mapou utiliser en ifdehors de l'emplacement.
Alexey Ten
@AlexeyTen, pourriez-vous fournir un exemple d'utilisation ifà l'extérieur du bloc de localisation?
Eliran Malka

Réponses:

19

J'utiliserais map:

map $http_origin $cors_header {
    default "";
    "~^https?://[^/]+\.example\.com(:[0-9]+)?$" "$http_origin";
}

server {
    ...
    location / {
        add_header Access-Control-Allow-Origin $cors_header;
        try_files $uri $uri/ /index.php;
    }
    ...
 }
Alexey Ten
la source
Que faire si les origines autorisées doivent être différentes pour chaque serveur?
Chris Martin
3
Utilisez plusieurs maps avec différentes variables
Alexey Ten