nginx为路径上存在的文件抛出404

时间:2015-11-19 20:41:32

标签: nginx

我对nginx有一个奇怪的问题。我使用的是1.8.0版本。使用Web服务器地址,我可以成功地从Web服务器地址提供文件,但不能从网站地址提供!

Web服务器地址:aoaapls00109la.stg-example.com 网站地址:stg.showdb.vod.example.com

我有一个像这样的服务器块设置:

  server {
        listen       80;
        server_name  aoaapls00109la.stg-example.com stg.showdb.vod.example.com stg.showdb.vod;

        location / {
            add_header Access-Control-Allow-Origin "*";
            root   /opt/www/webserver/nginx/html;
            index  index.html index.htm;
            access_log  logs/stg.showdb.vod.access.log;
            error_log  logs/stg.showdb.vod.error.log;
        }

        location  ^/videos/ {
            root   /opt/www/webserver/nginx/html/videos;
            index  index.html index.htm;
            error_log  logs/videos_error.log;
        }
    }

我在“视频”位置下面有一个包含文件的目录。 NGINX作为名为“showdb”的用户运行,因此文件归该用户所有:

[root@aoaapls00109la ~]# ls -ld /opt/www/webserver/nginx/html/videos
drwxr-xr-x. 3 showdb showdb 4096 Nov 18 13:25 /opt/www/webserver/nginx/html/videos

     [root@aoaapls00109la ~]# ls -lh /opt/www/webserver/nginx/html/videos
total 2.8G
-rw-rw-r--. 1 showdb showdb 738M May 12  2015 1681_Scarlett_Johansson_Repeat.mp4
-rw-rw-r--. 1 showdb showdb  30K May 11  2015 200X200.jpg
-rw-r--r--. 1 showdb showdb  260 Nov 18 10:44 crossdomain.xml
-rw-rw-r--. 1 showdb showdb 238M May 12  2015 some_guy_TS_0260-05122015.mp4
-rw-r--r--. 1 showdb showdb   63 Jun  3 07:10 index.html
-rw-rw-r--. 1 showdb showdb 302M May 12  2015 LNWSM_101314_SHOW0112_med_clean.mp4
-rw-rw-r--. 1 showdb showdb 864M May  5  2015 LNWSM_101314_SHOW0112.mp4
-rw-rw-r--. 1 showdb showdb 331M May 12  2015 LNWSM_101314_SHOW0112_sm_clean.mp4
-rw-rw-r--. 1 showdb showdb  23K May 15  2015 some_guy_logo.png
-rw-rw-r--. 1 showdb showdb 391M May 15  2015 RK119_EP_0514-15.mp4
-rw-rw-r--. 1 showdb showdb  24K May  8  2015 SNL_40_COMPANY_16x9_1_SNL.png
-rw-rw-r--. 1 showdb showdb 160K May 12  2015 TSJF_LOGO.png
drwxrwxr-x. 5 showdb showdb 4.0K Nov 19 15:17 webvtt_files

我注意到如果我使用第一个dns名称作为Web服务器本身,我可以成功导航并查看'videos'文件夹的内容。

使用curl演示,我可以使用Web服务器名称地址访问videos目录中的文件:

#curl http://aoaapls00109la.stg-example.com/videos/index.html
Video Store located on the server aoaapls00109la.stg-example.com

但如果我使用网站地址,而不是像上面那样访问索引文件,我会得到404 !!

 curl http://stg.showdb.vod.example.com/videos/index.html
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.8.0</center>
</body>
</html>

“视频”目录中的所有文件都会出现相同的行为。更糟糕的是,未提供服务且显示404的文件在访问或错误日志中都没有生成任何活动!

如果我在浏览器的一个标签中显示来自Web服务器地址的相同文件,我可以看到相同的位置给出了在Web服务器地址下成功显示的同一个文件的404。

这是整个nginx配置,如果可能有一些线索说明为什么会发生这种情况:

#user  nobody;
worker_processes  1;

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
#
user showdb;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        access_log  logs/host.access.log;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }



    }

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    server {
        listen       80;
        server_name  aoaapls00109la.stg-example.com stg.showdb.vod.example.com stg.showdb.vod;

        location / {
            add_header Access-Control-Allow-Origin "*";
            root   /opt/www/webserver/nginx/html;
            index  index.html index.htm;
            access_log  logs/stg.showdb.vod.access.log;
            error_log  logs/stg.showdb.vod.error.log;
        }

        location  ^/videos/ {
            root   /opt/www/webserver/nginx/html/videos;
            index  index.html index.htm;
            error_log  logs/videos_error.log;
        }
    }


    server {
        listen       80;
        server_name   stg.cdn.showsys.example.com stg.cdn.showsystem.example.com;
        add_header Access-Control-Allow-Origin "*";
          location / {
            root   /opt/www/webserver/nginx/html/videos;
            index  index.html index.htm;
            access_log  logs/stg.cdn.showsys.access.log;
            error_log  logs/videos_error.log;
        }
    }

server {
        listen       443 ssl;
        server_name   stg.showdb.vod.example.com stg.showdb.vod;
        ssl_certificate     /etc/pki/tls/certs/aoaapls00109la.stg-example.com.crt;
        ssl_certificate_key /etc/pki/tls/private/aoaapls00109la.stg-example.com.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;

        location / {
            add_header Access-Control-Allow-Origin "*";
            root   /opt/www/webserver/nginx/html;
            index  index.html index.htm;
            access_log  logs/stg.showdb.vod.access.log;
            error_log  logs/stg.showdb.vod.error.log;
        }

        location /videos/ {
            root   /opt/www/webserver/nginx/html/videos;
            index  index.html index.htm;
            error_log  logs/videos_error.log;
        }
    }

server {
        listen       443 ssl;
        server_name  stg.cdn.showsys.example.com stg.cdn.showsystem.example.com;
        ssl_certificate     /etc/pki/tls/certs/aoaapls00109la.stg-example.com.crt;
        ssl_certificate_key /etc/pki/tls/private/aoaapls00109la.stg-example.com.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;
        add_header Access-Control-Allow-Origin "*";

          location / {
            root   /opt/www/webserver/nginx/html/videos;
            index  index.html index.htm;
            access_log  logs/stg.cdn.showsys.access.log;
            error_log  logs/videos_error.log;
        }
    }

这非常莫名其妙!!我究竟做错了什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果您想要一个RegEx匹配,请不要忘记您的代字号(或~*不区分大小写的RegEx)。 RegEx匹配特朗普非RegEx匹配

location ~  ^/videos/ {
  ...
}

如果您不打算使用RegEx匹配

,请删除代字号
location /videos/ {
  ...
}