Я пытаюсь использовать auth_request модуль в сочетании с more_set_input_headers для автоматического входа в систему в моих пользователей в веб-приложения.
В основном это работает как это:
Это работает, но странно непоследовательный. Проблема - то, что, когда пользователь получает доступ к веб-приложению на / приложении/, оно работает, но когда к приложению получают доступ на/app/index.php, оно никогда не получает заголовок от nginx.
Я создал ложную конфигурацию, которая воспроизводит ошибку.
Конфигурация сайта Nginx:
server {
server_name www.example.com
index index.php index.html;
# --- Internal auth
location /auth {
internal;
root /var/www/sf;
location /auth/auth.php {
fastcgi_pass unix:/var/run/php5-fpm.sock;
include includes/fastcgi_params;
fastcgi_pass_request_body off;
fastcgi_param CONTENT_LENGTH 0;
}
location /auth {
deny all;
}
}
location / {
auth_request /auth/auth.php;
auth_request_set $auth_header $upstream_http_x_auth_header;
more_set_input_headers 'X-Test-Header: $auth_header';
location /app {
root /var/www/sf;
# Allow these locations
location = /app/ {
allow all;
}
location /app/index.php {
fastcgi_pass unix:/var/run/php5-fpm.sock;
include includes/fastcgi_params;
}
# Deny everything else
location /app/ {
deny all;
}
}
}
}
/var/www/sf/auth/auth.php:
<?php
// Mock precondition checker
function is_allowed() {
return true;
}
// Set the default response code
http_response_code(403);
if(!is_allowed())
exit();
// Return our header and the OK response code
header("X-Auth-Header: myusername");
http_response_code(200);
/var/www/sf/app/index.php:
<?php
if(empty($_SERVER["HTTP_X_TEST_HEADER"]))
exit("No header was supplied by nginx.");
exit("Nginx supplied header value: ". $_SERVER["HTTP_X_TEST_HEADER"]);
Ответ при выполнении ПОЛУЧИТЬ запроса к/app/:
Nginx supplied header value: myusername
Ответ при выполнении ПОЛУЧИТЬ запроса к/app/index.php:
No header was supplied by nginx.
У кого-либо была бы идея относительно того, что продолжается здесь?
Я использую Debian Хрипящий с пакетом nginx-отдельно-оплачиваемых-предметов от (1.6.0-1~dotdeb.1) DotDeb.
(маленькое примечание: когда Вы заменяете 'more_set_input_headers 'X-испытательный-коллектор: $auth_header''; с 'more_set_input_headers 'X-испытательный-коллектор: foobar''; веб-приложение всегда получает заголовок),
Такое поведение, вероятно, связано с тем, что
more_set_input_headers
обработчик выполняется перед фазой доступа.
(где работает auth_request
), и, следовательно, изменяет запрос только в том случае, если
он внутренне перенаправлен.
Решение проблемы - прекратить использование more_set_input_headers
.
(в любом случае, это очень неправильно, заголовки запросов не должны меняться) и
use native fastcgi_param
instead:
fastcgi_param HTTP_X_TEST_HEADER $auth_header;
Copied from http://mailman.nginx.org/pipermail/nginx/2014-June/044281.html.