Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Неверный редирект через php “header location”

#php #nginx #redirect


Добрый день, коллеги!
Не выходит настроить правильный редирект средствами php.

UPD: 21/10/2016 Вынес поддомен на который должна быть переадресация в отдельный конфиг
nginx и отдельный пул php-fpm. Не помогло.

Конфиг nginx основного домена:
domain.conf:

server {
    server_name  www.domain.ru;
    rewrite ^(.*) http://domain.ru$1 permanent;
}
server {
        listen 80;
        root /var/www/folder/public;

        index index.html index.htm index.php;

        server_name anotherdomain.ru subdomain2.domain.ru domain.ru;


        location ~ \.php$ {
            # root /var/www

                try_files $uri =404;
                fastcgi_keep_conn on;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $request_filename;
                include /etc/nginx/fastcgi_params;
        }

        location / {
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        location ~ /\.ht {
           deny all;
        }
}


Конфиг nginx поддомена:

subdomain.conf:

server {
        listen 80;
        root /var/www/folder/public;

        index index.html index.htm index.php;

        server_name subdomain.domain.ru;
        gzip on;
        gzip_disable "msie6";
        gzip_types text/plain text/css application/json application/x-javascript
text/xml application/xml application/xml+rss text/javascript application/javascript;


        location ~ \.php$ {
            # root /var/www

                try_files $uri =404;
                fastcgi_keep_conn on;
                fastcgi_pass unix:/var/run/php5-fpm-subdomain.sock;
                #fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $request_filename;
                include /etc/nginx/fastcgi_params;
        }

        location / {
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        location ~ /\.ht {
           deny all;
        }
}


При таком коде: 




В ответ получаю:

[root@svm]# curl -I http://domain.ru/indexfile.php
HTTP/1.1 302 Moved Temporarily
Connection: close
Date: Mon, 17 Oct 2016 13:57:59 GMT
Location: http://domain.ru/
Content-Type: text/html; charset=UTF-8
Server: nginx/1.4.6 (Ubuntu)


Но при этом, в консоли отладки firefox вижу такой Url Запроса:
http://domain.ru/subdomain.domain.ru

А при таком коде: 




Прилетает это:

[root@svm]# curl -I http://domain.ru/indexfile2.php
HTTP/1.1 302 Moved Temporarily
Connection: close
Date: Mon, 17 Oct 2016 13:57:59 GMT
Location: http://subdomain2.domain.ru/
Content-Type: text/html; charset=UTF-8
Server: nginx/1.4.6 (Ubuntu)


Для одного конкретного поддомена не присваивается новый заголовок с location.
В чём может быть проблема и как её исправить?

Наблюдение: Если в Location: указывать uri без http (То есть просто //subdomain.domain.ru,
то перенаправление работает. Почему? Как исправить?

Интересный факт - Добавил в файл несколько произвольных заголовков и их вывод: "print_r(headers_list());".
Судя по всему, php правильно выставляет headers, но они либо не применяются, либо их
переписывает nginx:

[root@svm]# curl -v http://domain.ru/indexfile.php
* About to connect() to 4cio.ru port 80 (#0)
*   Trying 11.11.11.11...
* Connected to domain.ru (11.11.11.11) port 80 (#0)
> GET /indexfile.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: domain.ru
> Accept: /
>
< HTTP/1.1 302 Moved Temporarily
< Connection: Keep-Alive
< Transfer-Encoding: chunked
< Expires: Mon, 26 Jul 2666 05:00:00 GMT
< Date: Tue, 18 Oct 2016 14:46:44 GMT
< Location: **http://domain.ru** - Ну вот откуда он берётся?
< Content-Type: text/html; charset=UTF-8
< Server: nginx/1.4.6 (Ubuntu)
< Cache-Control: no-cache
<
Array
(
    [0] => Expires: Mon, 26 Jul 2666 05:00:00 GMT
    [1] => Cache-Control: no-cache
    [2] => Location: http://subdomain.domain.ru
)


UPD 2: 21.10.2016 Добавил логи nginx в debug-режиме:

Лог очень большой. Сравнил два лога- один для поддомена на который переадресация
выполяется нормально, второй для поддомена на который переадресация не выполняется.
В обоих случаях, nginx получает новый location при первой обработке php-файла. Ниже
предоставлены выдержки с того момента, как они начинают отличаться:

Лог для не работающего поддомена:

http fastcgi sent end request
pipe write downstream: 1
pipe write downstream done
event timer: 61, old: 1477057711592, new: 1477057711593
http upstream exit: 0000000000000000
finalize http upstream request: 0
finalize http fastcgi request
free rr peer 1 0
close http upstream connection: 61
free: 000000000240DFA0, unused: 48
event timer del: 61: 1477057711592
reusable connection: 0
http upstream temp fd: -1
http output filter "/indexfile.php?"
http copy filter: "/indexfile.php?"
image filter
xslt filter body
http postpone filter "/indexfile.php?" 00007FFF3BF1A200
http chunk: 0
write old buf t:1 f:0 000000000249A7E8, pos 000000000249A7E8, size: 274 file: 0, size: 0
write new buf t:0 f:0 0000000000000000, pos 00000000004AA3DA, size: 5 file: 0, size: 0
http write filter: l:1 f:0 s:279
http write filter limit 0
writev: 279
http write filter 0000000000000000
http copy filter: 0 "/indexfile.php?"
http finalize request: 0, "/indexfile.php?" a:1, c:1
set http keepalive handler
http close request
http log handler
free: 000000000249AA20
free: 0000000002487340, unused: 8
free: 0000000002499A10, unused: 8
free: 0000000002409890, unused: 3556
free: 00000000024B1630
hc free: 0000000000000000 0
hc busy: 0000000000000000 0
tcp_nodelay
reusable connection: 1
event timer add: 60: 65000:1477057716593
post event 00000000024E0FA0
delete posted event 00000000024E0FA0
http keepalive handler
malloc: 00000000024B1630:1024
recv: fd:60 -1 of 1024
recv() not ready (11: Resource temporarily unavailable)
free: 00000000024B1630
post event 00000000024E0FA0
post event 00000000024F47B0
delete posted event 00000000024F47B0
http empty handler
delete posted event 00000000024E0FA0
http keepalive handler
malloc: 00000000024B1630:1024
recv: fd:60 329 of 1024
reusable connection: 0
posix_memalign: 0000000002487340:4096 @16
event timer del: 60: 1477057716593
http process request line
http request line: "GET / HTTP/1.1"
http uri: "/"
http args: ""
http exten: ""
posix_memalign: 0000000002499A10:4096 @16
http process request header line
http header: "Reverse-Via: FF-SRV"
http header: "Host: domain.ru"  ------Вот здесь должен быть subdomain.domain.ru
http header: "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101
Firefox/49.0"
http header: "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
http header: "Accept-Language: en-US,ru-RU;q=0.8,ru;q=0.5,en;q=0.3"
http header: "DNT: 1"
http header: "Upgrade-Insecure-Requests: 1"
http header: "Connection: Keep-Alive"
http header done


Лог для работающего поддомена:

http fastcgi sent end request
posix_memalign: 00000000024B2620:4096 @16
pipe write downstream: 1
pipe write downstream done
event timer: 55, old: 1477057946320, new: 1477057946320
http upstream exit: 0000000000000000
finalize http upstream request: 0
finalize http fastcgi request
free rr peer 1 0
close http upstream connection: 55
free: 0000000002413EC0, unused: 48
event timer del: 55: 1477057946320
reusable connection: 0
http upstream temp fd: -1
http output filter "/indexfile.php?"
http copy filter: "/indexfile.php?"
image filter
xslt filter body
http postpone filter "/indexfile.php?" 00007FFF3BF1A200
http chunk: 0
write old buf t:1 f:0 000000000249C4B0, pos 000000000249C4B0, size: 270 file: 0, size: 0
write new buf t:0 f:0 0000000000000000, pos 00000000004AA3DA, size: 5 file: 0, size: 0
http write filter: l:1 f:0 s:275
http write filter limit 0
writev: 275
http write filter 0000000000000000
http copy filter: 0 "/indexfile.php?"
http finalize request: 0, "/indexfile.php?" a:1, c:1
set http keepalive handler
http close request
http log handler
free: 000000000240A000
free: 00000000025096F0, unused: 8
free: 000000000249B6E0, unused: 8
free: 00000000024B2620, unused: 3572
free: 0000000002488790
hc free: 0000000000000000 0
hc busy: 0000000000000000 0
tcp_nodelay
reusable connection: 1
event timer add: 54: 65000:1477057951320
post event 00000000024E0030
delete posted event 00000000024E0030
http keepalive handler
malloc: 0000000002488790:1024
recv: fd:54 -1 of 1024
recv() not ready (11: Resource temporarily unavailable)
free: 0000000002488790
delete posted event 00000000024F3840
http empty handler
accept: 22.22.22.22 fd:55
event timer add: 55: 60000:1477057946388
reusable connection: 1
epoll add event: fd:55 op:1 ev:80000001
post event 00000000024E1BD0
delete posted event 00000000024E1BD0
http wait request handler
posix_memalign: 00000000024888A0:256 @16
malloc: 00000000024889B0:1024
recv: fd:55 336 of 1024
reusable connection: 0
posix_memalign: 00000000025096F0:4096 @16
http process request line
http request line: "GET / HTTP/1.1"
http uri: "/"
http args: ""
http exten: ""
posix_memalign: 000000000249B6E0:4096 @16
http process request header line
http header: "Reverse-Via: FF-SRV"
http header: "Host: subdomain2.domain.ru"
http header: "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101
Firefox/49.0"
http header: "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
http header: "Accept-Language: en-US,ru-RU;q=0.8,ru;q=0.5,en;q=0.3"
http header: "DNT: 1"
http header: "Upgrade-Insecure-Requests: 1"
http header: "Connection: Keep-Alive"
http header done


UPD 3: 24/10/2016 Наблюдение

Ели я размещаю файлик с переадресацией в subdomain2.domain.ru, то перенаправление
на subdomain.domain.ru работает без проблем.
    


Ответы

Ответ 1



Коллеги, проблема решена. Проблема оказалась вообще не в nginx. ПЕМКИС, как это часто и бывает. Оказывается, на стороне Заказчика стоит прозрачный TMG, о чём не сообщили. В этом TMG было включено некорректное правило с изменением заголовков. Было включено "Подставлять действительный заголовок вместо запрошенного" для зоны domain.ru p.s. ПЕМКИС = Проблема Есть Между Клавиатурой И Стулом

Ответ 2



Попробуйте: rewrite ^(.*) http://domain.ru$request_uri permanent;

Комментариев нет:

Отправить комментарий