Nginx http 到 https 重定向下载空文件

Nginx http 到 https 重定向下载空文件

我试图将我的Laravel+vuejs+nuxtjs项目从httphttps但当我进入http://example.com或者http://www.example.com下载的是空文件

到目前为止我做了什么:

1-在 nginx.conf 中注释default_type application/octet-stream并添加default_type text/html

2-types { } default_type "text/plain";location /{}example.com.conf中定义

3-nginx 重定向,代码如下

server{
  listen xx.xx.xx.xx:80;
    server_name example.com www.example.com;
  return 301 https://www.example.com$request_uri;
}

4- 尝试使用以下 example.com.conf 文件通过 .php 文件对其进行重定向:

       server {
          listen 37.152.191.249:80;
          server_name www.example.com example.com;

         access_log /usr/local/apache/domlogs/example.com.bytes bytes;
        access_log /usr/local/apache/domlogs/example.com.log combined;
        error_log /usr/local/apache/domlogs/example.com.error.log error;

        root /home/example/public_html/;
        index index.php;

   location / {
types { } default_type "text/plain";
    try_files                       $uri $uri/  /index.php?$query_string;

}

location ~ \.php$ {
   fastcgi_split_path_info         ^(.+\.php)(/.+)$;
    fastcgi_pass                    127.0.0.1:9000;
    fastcgi_index                   index.php;
    include                         fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_intercept_errors        off;
    fastcgi_buffer_size             16k;
    fastcgi_buffers                 4 16k;
    fastcgi_connect_timeout         300;
   fastcgi_send_timeout            300;
    fastcgi_read_timeout            300;
}


        location ~* "/\.(htaccess|htpasswd)$" {deny all;return 404;}

        disable_symlinks if_not_owner from=/home/example/public_html;
}

public_html 中的index.php代码:

    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;

以上方法均无效,问题仍然存在。

+当前配置:

nginx-t报告:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

例如.com.ssl.conf:

server{
  listen xx.xx.xx.xx:443 http2 ssl;
    server_name example.com;
        ssl_certificate      /etc/pki/tls/certs/example.com.bundle;
        ssl_certificate_key  /etc/pki/tls/private/example.com.key;
        ssl_protocols TLSv1.2;
        ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EE3CDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA!RC4:EECDH:!RC4:!aNULL:!eN$
        ssl_prefer_server_ciphers   on;

       ssl_session_cache   shared:SSL:10m;
       ssl_session_timeout 60m;
       return 301 https://www.example.com$request_uri;
}
       server {
          listen xx.xx.xx.xx:443 http2 ssl;
          server_name www.example.com;

         access_log /usr/local/apache/domlogs/example.com.bytes bytes;
        access_log /usr/local/apache/domlogs/example.com.log combined;
        error_log /usr/local/apache/domlogs/example.com.error.log error;
        ssl_certificate      /etc/pki/tls/certs/example.com.bundle;
        ssl_certificate_key  /etc/pki/tls/private/example.com.key;
        ssl_protocols TLSv1.2;
        ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA!RC4:EECDH:!RC4:!aNULL:!eN$
        ssl_prefer_server_ciphers   on;

        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 60m;

        root /home/example/core/public/;
        index index.php;

   location / {
  proxy_set_header                Connection 'upgrade';
    proxy_http_version              1.1;
    proxy_pass                      https://xx.xx.xx.xx:3000$uri;
    proxy_intercept_errors          on;# In order to use error_page directive this needs to be on
    error_page                      404 = @php;
}

location @php {
    try_files                       $uri $uri/  /index.php?$query_string;

}

location ~ \.php$ {
   fastcgi_split_path_info         ^(.+\.php)(/.+)$;
    fastcgi_pass                    127.0.0.1:9000;
    fastcgi_index                   index.php;
    include                         fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   fastcgi_intercept_errors        off;
    fastcgi_buffer_size             16k;
    fastcgi_buffers                 4 16k;
    fastcgi_connect_timeout         300;
   fastcgi_send_timeout            300;
    fastcgi_read_timeout            300;
}


        location ~* "/\.(htaccess|htpasswd)$" {deny all;return 404;}

        disable_symlinks if_not_owner from=/home/example/public_html;

        location /.well-known/acme-challenge {
                default_type "text/plain";
                alias /usr/local/apache/autossl_tmp/.well-known/acme-challenge;
        }

        location /.well-known/pki-validation {
                default_type "text/plain";
                alias /usr/local/apache/autossl_tmp/.well-known/acme-challenge;
        }
}


当前 example.com.conf

server{
  listen xx.xx.xx.xx:80;
    server_name example.com www.example.com;
  return 301 https://www.example.com$request_uri;
}

我没有添加 nginx -T 报告,因为它显示了来自其他网站的不相关的配置文件。

此外,运行多个站点和 wordpress 站点的服务器使用提供的代码进行重定向也没有问题#3重定向,但当涉及到使用 nuxtjs 的网站,我下载的是一个空文件。

任何帮助都将不胜感激

答案1

我复制了我的一个 wordpress nginx 配置并替换了xxx部分域名服务器 IP

server {
        listen yyy.yyy.yyy.yyy:80;
        server_name xxx.com  www.xxx.com;
  return 301 https://xxx$request_uri;

        location / {
                try_files $uri $uri/ /index.php?$args;
                add_header Strict-Transport-Security "max-age=31536000";
                add_header X-XSS-Protection "1; mode=block" always;
                add_header X-Content-Type-Options "nosniff" always;

                location ~.*\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
                        expires max;
                }

                location ~ [^/]\.php(/|$) {
                        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                        if (!-f $document_root$fastcgi_script_name) {
                                return  404;
                        }

                        fastcgi_pass    127.0.0.1:9000;
                        fastcgi_index   index.php;
                        include         /etc/nginx/fastcgi_params;
                }

        }

        location ~* "/\.(htaccess|htpasswd)$" {deny all;return 404;}


        disable_symlinks if_not_owner from=/home/domainname/public_html;

        location /.well-known/acme-challenge {
                default_type "text/plain";
                alias /usr/local/apache/autossl_tmp/.well-known/acme-challenge;
        }

        location /.well-known/pki-validation {
                default_type "text/plain";
                alias /usr/local/apache/autossl_tmp/.well-known/acme-challenge;
        }
}

它被重定向到 https 而不下载任何内容,我已将对 nginx 和 php-fpm 所做的所有更改恢复为默认设置。

现在它可以工作了但是为什么呢?

玩了一会后,发现将工作 nginx 配置的位置更改为location ~ \.php$(我之前使用的那个)会导致问题再次出现。就是这样!

location ~ \.php$没有进一步调查为什么不是location ~ [^/]\.php(/|$)确实有效。

希望能帮助到你。

答案2

温斯顿克劳斯@serverfault于 2017 年 4 月对同一主题做出了贡献。
位置 ~ 修饰符

[^/]\.php(/|$)

可能指向不包含

listen 80 http2

指令,但

\.php$

确实可能会影响 nginx 如何监听端口 80。

相关内容