nginx设置404页码不生效指定域名跨域的设置

Posted reblue520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx设置404页码不生效指定域名跨域的设置相关的知识,希望对你有一定的参考价值。

一、404页面配置后不能生效的问题

1.配置了404页面,跳转不到根目录的404.html,即打开的错误页面不变,不发生301跳转就显示 /404.html
error_page  404 403            /404.html;

2.于是配置了 error_page  404 403            https://film.chinasoft.jp/404.html;  这样会导致大量的404发生301跳转,不利于seo优化

3.之前配置nginx.conf的主配置添加下面参数就可以了,该次不生效

proxy_intercept_errors on;
fastcgi_intercept_errors on;

4.想着模拟一次生产环境,进行验证
a.拷贝 生产的 /data/www/vhosts/film.chinasoft.jp 目录到yunweitools中
b.配置vhost.d和rewrite.d的配置,问题依旧说明不是nginx版本的问题
c.于是拷贝正常跳转的一个配置进行修改,问题解决
d.于是diff对比之前的配置和现在正常的配置,发现没有大的区别  httpsdocs 多了一个s,这才是问题的关键
root            /data/www/vhosts/film.chinasoft.jp/httpdocs ; 是  root            /data/www/vhosts/film.chinasoft.jp/httpsdocs ;


问题描述:访问 https://itube.chinasoft.com/aaaa/bbbb/ 类似这种不存在的页面返回首页,访问各种不存在的页面都返回首页,测试了很多种方法不行

后面出了狠招,直接将环境移植到一台可以测试的服务器中(可以任意测试,没有风险)
可能出现的问题:
1.整体的nginx环境问题
2.nginx配置问题
3.页面有隐性跳转

具体步骤:
1.部署好nginx和php移植后台程序到测试服务器,本地绑定hosts,发现问题依旧,排除服务器环境问题
2.将首页改为 <h1>index</h1> 404.html改为 <h1>404</h1>,避免页面内部问题,发现问题依旧,排除页面问题
3.修改vhost/itube.chinasoft.com文件,将php部分注释掉发现问题没有了
定位到是php部分的配置问题

[root@EOP_chinasoft_web01:/usr/local/nginx/conf/vhost.d]# cat itube.chinasoft.com.conf
server {
        listen 80;
        server_name     itube.chinasoft.com;
        access_log      /data/www/logs/nginx_log/access/itube.chinasoft.com_access.log main ;
        error_log       /data/www/logs/nginx_log/error/itube.chinasoft.com_error.log ;
        root            /data/www/vhosts/itube.chinasoft.com/httpdocs ;
        index           index.html index.shtml index.php ;
    include        rewrite.d/itube.chinasoft.com.conf ;
    error_page  404 403             /404.html;    

        rewrite ^/(.*)$ https://itube.chinasoft.com/$1 permanent;    #跳转到Https,http部分下面的代码可以忽略
        
        location ~ .php$ {
                fastcgi_pass unix:/tmp/php-cgi.sock;
                fastcgi_index index.php;
                #fastcgi_param SCRIPT_FILENAME ;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
                expires -1;
        }

    location / {
                include proxy_params;
                if (!-d $request_filename){
                        set $flag 1$flag;
                }
                if (!-f $request_filename){
                        set $flag 2$flag;
                }
                if ($flag = "21"){
                                rewrite ^(.*)$ /index.php last;
                        expires -1;
                }
        }


}

server {
        listen 443;
        ssl on;

        ssl_certificate         cert2016/chinasoft_com.crt;
        ssl_certificate_key     cert2016/chinasoft_com.key;
        ssl_dhparam     cert2016/dh_2048.pem;

        ssl_session_timeout     5m;
        ssl_protocols   TLSv1 TLSv1.1 TLSv1.2;


        ssl_ciphers     "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-E
CDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-S
HA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!AES128-GCM-SHA256:!AES256-GCM-SHA384:!AES128-SHA256:!AES256-SHA256:!AES128-SHA:!AES256-SHA:AES:!CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:ED
H-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA";


        ssl_prefer_server_ciphers       on;
#       add_header Strict-Transport-Security max-age=15768000;

        #ssl_stapling        on;
        #ssl_stapling_verify        on;


        server_name     itube.chinasoft.com;
        access_log      /data/www/logs/nginx_log/access/itube.chinasoft.com_access.log main ;
        error_log       /data/www/logs/nginx_log/error/itube.chinasoft.com_error.log ;

        root            /data/www/vhosts/itube.chinasoft.com/httpdocs ;
        index           index.html index.shtml index.php ;
        include         rewrite.d/itube.chinasoft.com.conf ;
        error_page  404 403             /404.html;

        location ~ .php$ {
                fastcgi_pass unix:/tmp/php-cgi.sock;
                fastcgi_index index.php;
                #fastcgi_param SCRIPT_FILENAME ;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
                expires -1;
        }
    
    # 问题就出在这里
        #location / {
        #        include proxy_params;
        #        if (!-d $request_filename){
        #                set $flag 1$flag;
        #        }
        #        if (!-f $request_filename){
        #                set $flag 2$flag;
        #        }
    #    # 问题就出在这里,直接注释掉即可
        #        if ($flag = "21"){
        #                rewrite ^(.*)$ /index.php last;
        #                expires -1;
        #        }
        #    error_page  404 403             /404.html;
        #}

}

二、跳转设置

film.chinasoft.jp.conf配置
# 404配置,访问不存在的页面不生效
error_page  404 403              /404.html;

# https://film.chinasoft.jp/404.html 页面存在
于是修改
error_page  404 403              https://film.chinasoft.jp/404.html;

页面地址:
https://recoverit.chinasoft.com/support/refund-and-renewal-faqs.html

点击里面的链接会跳到

http://support.chinasoft.com/&_ga=2.107563586.1749405195.1569403744-727936012.1569403744#/article?id=1710

返回1

加入:
location / {
          try_files $uri $uri/ /index.html;
    }


三、nginx的配置指定域名可以跨域
map $http_origin $corsHost {
    default 0;
    "~http://www.123admin.com" http://www.123admin.com;
    "~http://m.123admin.com" http://m.123admin.com;
}

https://shopcart.chinasoft.com,https://film.chinasoft.com‘

server
{
    listen 80;
    server_name search.123admin.com;
    root /nginx;
    location /
    {
        add_header Access-Control-Allow-Origin $corsHost;
    }
}

以上是关于nginx设置404页码不生效指定域名跨域的设置的主要内容,如果未能解决你的问题,请参考以下文章

Nginx前后端跨域

Nginx前后端跨域

Nginx前后端跨域

利用Nginx设置跨域的方式

利用Nginx设置跨域的方式

关于多级域名跨域知识小记