У некоторых клиентов на шареде, в котором использутся связка 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}]
$ 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}]
Тоже с такой проблемой столкнулся, спросил у СТП Битрикс. Помогла вставка данного кода в 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;