понедельник, 12 сентября 2016 г.

Решение проблемы с редиректом страницы на порт 80

У некоторых клиентов на шареде, в котором использутся связка Nginx+Apache, может возникать проблема с редиректом (часто встречается на CMS битрикс):
$ curl -I http://site.ru/bitrix/admin
HTTP/1.1 301 Moved Permanently
Server: nginx
Location: http://site.ru:80/bitrix/admin/

Т.е. видим, что идет некорректный редирект на https://site.ru:80/bitrix/admin/
Если же напрямую со слешем отправляем запрос, то все ок:
$ curl -I http://site.ru/bitrix/admin/ --silent | head -1
HTTP/1.1 200 OK


Решение состоит в том, чтобы в локейшны для @fallback и / добавить директиву:
proxy_set_header X-Forwarded-Host $http_host;

Примерно так:
location @fallback {
...
   proxy_set_header X-Forwarded-Host $http_host;
}
location / {
...
   proxy_set_header X-Forwarded-Host $http_host;
}

После рестарта конфига nginx, все ок:
$ curl -IL http://site.ru/bitrix/admin
HTTP/1.1 301 Moved Permanently
Server: nginx
Location: http://site.ru/bitrix/admin/

HTTP/1.1 200 OK
Server: nginx

Вот еще один из вариантов решения, с использованием только .htaccess (я сам не тестил пока этот вариант):
# vim .htaccess
RewriteCond %{REQUEST_URI} ^(.*/[^/\.]+)$ 
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [R=301,L] 

RewriteCond %{REQUEST_URI} ^(.*)/$ 
RewriteRule .* - [L] 
RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 
RewriteCond %{REQUEST_METHOD} =GET 
RewriteCond %{REQUEST_URI} ^(.*)/index.php$ 
RewriteRule ^(.*)$ %1/ [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$ 
RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L] 
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]

1 комментарий:

Rmn комментирует...

Тоже с такой проблемой столкнулся, спросил у СТП Битрикс. Помогла вставка данного кода в dbconn.php:

if (($pos = strpos($_SERVER['HTTP_HOST'], ':')) !== false)
{
$HTTP_HOST = $_SERVER['HTTP_HOST'] = substr($_SERVER['HTTP_HOST'],0,$pos);
}

$_SERVER["HTTPS"] = "On";
$_SERVER['SERVER_PORT'] = 443;