301 重定向后更改协议的问题 (Nginx/BitrixVM/CentOS6.5)

0 redirect nginx bitrix

我正在使用以下设置:

s1.conf

# Default website
server {

    listen 80;
    server_name test.com www.test.com;
    return 301 https://test.com$request_uri;  # enforce https

    server_name_in_redirect off;

    access_log /var/log/nginx/access.log main;
    error_log  /var/log/nginx/error.log warn;

    proxy_set_header    X-Real-IP        $remote_addr;
    proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_set_header    Host $host:80;
    proxy_set_header<   X-Forwarded-Host $http_host

    set $proxyserver    "http://127.0.0.1:8888";
    set $docroot        "/home/bitrix/www";

    index index.php;
    root /home/bitrix/www;

    # Redirect to ssl if need
    if (-f /home/bitrix/www/.htsecure) { rewrite ^(.*)$ https://$host$1 permanent; }

    # Include parameters common to all websites
    include bx/conf/bitrix.conf;

    # Include server monitoring locations
    include bx/server_monitor.conf;
}
Run Code Online (Sandbox Code Playgroud)

s1_ssl.conf

# Default SSL certificate enabled website
server {
    listen  443 default_server ssl;
    server_name test.com;

    # Enable SSL connection
    include bx/conf/ssl.conf;
    server_name_in_redirect off;

    proxy_set_header    X-Real-IP   $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    Host        $http_host:443;
    proxy_set_header    X-Forwarded-Host $http_host;
    proxy_set_header    X-Forwarded-Proto https;

    proxy_set_header    HTTPS       YES;

    set $proxyserver    "http://127.0.0.1:8888";
    set $docroot        "/home/bitrix/www";

    index index.php;
    root /home/bitrix/www;

    # Include parameters common to all websites
    include bx/conf/bitrix.conf;

    # Include server monitoring API's
    include bx/server_monitor.conf;

}
Run Code Online (Sandbox Code Playgroud)

当我尝试链接http://test.com/xyz/https://test.com/xyz/时,一切正常。但是当我尝试像http://test.com/xyzhttps://test.com/xyz这样的链接时,我收到 400 Bad Request,纯 HTTP 请求已发送到 HTTPS 端口

这个卷曲输出:

curl -I -k https://test.com/xyz
HTTP/1.1 301 Moved Permanently
Server: nginx/1.6.2
Date: Mon, 22 Feb 2016 09:13:28 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Location: http://test.com:443/xyz/
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Run Code Online (Sandbox Code Playgroud)

为什么协议改为http?

小智 5

您忘记说对http://test.com/xyz的引用是目录。

什么是邪恶:mod_dir

当服务器收到 URL http://servername/foo/dirname(其中 dirname 是目录)的请求时,会发出“尾部斜杠”重定向。目录需要尾部斜杠,因此 mod_dir 发出重定向到http://servername/foo/dirname/

对于他来说“HTTPS on”不起作用,方案 https:// not be

应该做什么:

1) nginx 配置不涉及任何内容

2) 在您的域的 httpd 配置中,例如: /etc/httpd/bx/conf/bx_ext_site.local.conf

其中字符串包含您的服务器名称,例如: ServerName site.local

补充如下: https://

是这样的: ServerName https://site.local

这就是你所需要的

它无需任何重定向即可工作

意味着问题隐藏在手册中http://httpd.apache.org/docs/2.2/mod/core.html#servername

有时,服务器在处理 SSL 的设备后面运行,例如反向代理、负载平衡器或 SSL 卸载设备。在这种情况下,请在 ServerName 指令中指定客户端连接的 https:// 方案和端口号,以确保服务器生成正确的自引用 URL。