$ 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, вы можете начать свое путешествие по адресу: