技术饭

Nginx设置alias的二级目录之后,首页访问正常,但是js、css、图片等静态文件出现404

copylian    1 评论    41757 浏览    2020.03.30

Nginx设置alias的二级目录之后,首页访问正常,但是js、css、图片等静态文件出现404,之前配置了一个域名为pc访问域名,域名加个目录是访问后台,类似:a.com 是首页,a.com/admin 是后台,而且两个目录在同一个层级,但是alias配置之后一直找不到静态文件。


初始方案:

域名:a.com

前端:a.com 指向 /manyidea/www/svnweb/hdd/dist;

后台:a.com/dist 指向 /manyidea/www/svnweb/hddfront/dist;

两个目录在同一级,hddfront 不是在 hdd 里的二级目录


初始Nginx配置:

server {

        listen 443;

        server_name  hddtest.many-idea.com;

        ssl on;

        index index.html index.htm index.php;

        root /manyidea/www/svnweb/hdd/dist;

        ssl_certificate   /etc/nginx/cert/hdd/hddtest.many-idea.com.pem;

        ssl_certificate_key  /etc/nginx/cert/hdd/hddtest.many-idea.com.key;

        ssl_session_timeout 5m;

        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        ssl_prefer_server_ciphers on;

        client_max_body_size 100m;


        #去掉$是为了不匹配行末,即可以匹配.php/,以实现pathinfo

        #如果你不需要用到php5后缀,也可以将其去掉

        location ~ .php

        {

                #原有代码

                fastcgi_pass  127.0.0.1:9000;

                fastcgi_index index.php;

                include fastcgi_params;

                #定义变量 $path_info ,用于存放pathinfo信息

                set $path_info "";

                #定义变量 $real_script_name,用于存放真实地址

                set $real_script_name $fastcgi_script_name;

                #如果地址与引号内的正则表达式匹配

                if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {

                        #将文件地址赋值给变量 $real_script_name

                        set $real_script_name $1;

                        #将文件地址后的参数赋值给变量 $path_info

                        set $path_info $2;

                }

                #配置fastcgi的一些参数

                fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;

                fastcgi_param SCRIPT_NAME $real_script_name;

                fastcgi_param PATH_INFO $path_info;

        }

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

        {

                expires 30d;

        }

        location ~ .*\.(js|css)?$

        {

                expires 1h;

        }

        location ~ ^(.*)\/\.svn\/{

                deny all;

        }


        #伪静态规则

        location / { 

                if (!-e $request_filename) {

                        rewrite  ^(.*)$  /index.php?s=$1  last;

                        break;

                }

        }


        #重定向后台目录

        location /dist/ {

                alias /manyidea/www/svnweb/hddfront/dist;

                location ~ ^/dist/.*\.(js|css|gif|jpg|jpeg|png|bmp|swf|flv)?$ {

                        #root /manyidea/www/svnweb/hddfront/dist; //方案1 不行

                        alias /manyidea/www/svnweb/hddfront/dist; //方案2 不行

                }

        }


        #日志

        access_log  /etc/nginx/access/logs/hdd.access.log;

        error_log /etc/nginx/access/logs/hdd.error_log;

}


结果是:上面两种配置都行不通


经过多种测试,将配置文件里的 location ~ .*\.(js|css)?$ 与 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 这两项注释之后,也就是无需设置静态文件的信息就没问题。这种解决方案不太理想。


最终解决方案:将 alias 改成 root,location /dist/  这个 dist 要与指向的目录对应,然后 root /manyidea/www/svnweb/hddfront; 去除 dist 即可。

#重定向后台目录

location /dist/ {

        root /manyidea/www/svnweb/hddfront;

        location ~ ^/dist/.*\.(gif|jpg|jpeg|png|bmp|swf|flv)?$ {

                root /manyidea/www/svnweb/hddfront;

                expires 30d;

        }

        location ~ ^/dist/.*\.(js|css)?$ {

                root /manyidea/www/svnweb/hddfront;

                expires 1h;

        }

}


解释:alias与root的区别

location /app {

        root /var/www/html;

}


root 的路径为 /var/www/html/app


location /app {

    alias /var/www/html;

}


alias 的路径 /var/www/html


root 是全路径。拼接 location 和 root 设置的路径


alias 相当于重置路径,重置为 alias 设置的路径


参考:

https://segmentfault.com/q/1010000015208338

只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!

文明上网理性发言!