$ Http_referer ведет себя как $document_uri

Мне нужно установить caller param в ssi include как текущий uri, но $document_uri работал странно

Часть шаблона с ssi-include:

<div class="panel">
    <div class="ym-wrapper">
      <div class="ym-wbox">
        <!--# set var="panel"
          value="<!--# include virtual='/panel/?project=project_name&color=dark&caller=$http_referer' -->" -->
        <!--# echo var="panel" encoding="none" -->
      </div>
    </div>
  </div>

Точно, $http_referer, а не $document_uri

Формат журнала Nginx:

log_format  subtimed  '$remote_addr - $remote_user [$time_local] '
                      '"INC $uri$is_args$args" $status $bytes_sent "$http_referer" '
                      '"$http_user_agent"

Местоположение Nginx для /panel/:

location /panel/ {
            internal;
            ssi  on;
            proxy_set_header        Host panel.domain.zone;
            proxy_method            GET;
            proxy_pass              http://panel.domain.zone/;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_connect_timeout   1s;
            proxy_send_timeout      2s;
            proxy_read_timeout      2s;
            proxy_intercept_errors  on;
            log_subrequest on;
    }

Я открываю страницу http://devel.domain.zone, и я вижу в журнале nginx:

xxx.xxx.xxx.xxx - - [15/Oct/2015:18:29:31 +0300] "INC /panel/?project=project_name&color=dark&caller=http://devel.domain.zone" 200 0 "http://devel.domain.zone/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0"

Хорошо, перейдите на страницу http://devel.domain.zone/sec/?theme=102 Nginx log:

xxx.xxx.xxx.xxx - - [15/Oct/2015:18:30:29 +0300] "INC /panel/?project=project_name&color=dark&caller=http://devel.domain.zone/sec/?theme=102" 200 0 "http://devel.domain.zone/sec/?theme=102" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0"

Оказывается, что $http_referer ведет себя как $document_uri... Итак, если я установил $document_uri вместо $http_referer в ssi include, я вижу в nginx log что-то вроде этого:

xxx.xxx.xxx.xxx - - [15/Oct/2015:18:30:29 +0300] "INC /panel/?project=project_name&color=dark&caller=/ga/ga.js" 200 0 "http://devel.domain.zone/sec/?theme=102" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0"

WTF?!! В какой точке вычисляется переменная $document_uri? Как передать переменные в include: как имя или как значение?

Ответ 1

Не совсем понятно, что вы просите. Что ты сделал? Что вы ожидали? Что вы получили вместо этого?

Согласно http://nginx.org/r/%24document_uri, $document_uri совпадает с просто $uri (и ни один не следует путать с $request_uri, который является совершенно другой переменной).

Переменная $uri, в свою очередь, также довольно четко документирована (на http://nginx.org/r/%24uri) — по-моему, это состояние nginx location/rewrite state machine — все внутренние rewrite, которые вы выполняете, изменяют эту переменную, и она в основном всегда находится в процессе перезаписи. Другим важным моментом является то, что, если вы, возможно, не модифицируете эту переменную самостоятельно, она также пропускает часть $is_args$args от нее, а также нормализуется, как и location, поскольку location соответствие выполняется точно против $uri.

Кстати, для некоторых интересных вещей, которые вы могли бы сделать с $uri с набором директив rewrite, посмотрите http://mdoc.su/ (не забудьте взглянуть на nginx.conf!), а также более простой, но, тем не менее, заслуживающий внимания и полезный образец кода в ServerFault: "Как проверить право собственности на сайт в Инструментах для веб-мастеров Google через nginx.conf?" .

Если вам интересно узнать, как эти вещи реализованы на C, вы можете начать свое путешествие по адресу: