web-dev-qa-db-fra.com

NGINX $ request_uri vs $ uri

Comment déterminez-vous quand utiliser $request_uri vs $uri?

Selon la documentation de NGINX, $request_uri est la demande d'origine (par exemple, /foo/bar.php?arg=baz inclut des arguments et ne peut pas être modifié) mais $uri fait référence à l'URI modifié.

Si l'URI ne change pas, est-ce que $ uri = $ request_uri?

Serait-il incorrect, meilleur ou pire d'utiliser:

map $uri $new_uri {
  # do something
}

contre

map $request_uri $new_uri {
  # do something
}
24
teknova

$uri n'est pas équivalent à $request_uri.

La variable $uri est définie sur l'URI que nginx est en cours de traitement - mais il est également soumis à la normalisation, notamment:

  • Suppression de ? et chaîne de requête
  • Les caractères / consécutifs sont remplacés par un seul /
  • Les caractères encodés en URL sont décodés

La valeur de $request_uri est toujours l'URI d'origine et n'est soumise à aucune des normalisations ci-dessus.

La plupart du temps, vous utiliseriez $uri, car il est normalisé. L'utilisation de $request_uri au mauvais endroit peut entraîner le codage double des caractères encodés en URL.

Utilisez $request_uri dans une directive map, si vous devez faire correspondre l'URI et sa chaîne de requête.

33
Richard Smith

Une autre différence concernant $uri et $request_uri dans proxy_cache_key est $request_uri inclura anchor tags part, mais $uri$is_args$args l'ignorera.

Effectuez une opération curl: curl -I static.io/hello.htm?id=1#/favor/goods:

proxy_cache_key $scheme://$Host$uri$is_args$args; => Cache KEY: http://static.io/hello.htm?id=1
proxy_cache_key $scheme://$Host$request_uri; => Cache KEY: http://static.io/hello.htm?id=1#/favor/goods

Nginx Document: http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_uri

  • $request_uri: adresse URI complète de la demande d'origine (avec arguments)
  • $uri: URI actuel dans la requête, normalisé La valeur de $ uri peut changer pendant le traitement de la requête, par ex. lors de redirections internes ou lors de l'utilisation de fichiers d'index.

Clé du cache du proxy: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_key

5
Rod Terry