当我在url中使用已知的文件扩展名时,nginx 404

时间:2013-11-11 09:52:12

标签: nginx

每当我在url nginx中放入一个已知的文件扩展名时返回404 Not Found

domain.com/myroute.foodomain.com/foo/myroute.foo没问题,但domain.com/myroute.phpdomain.com/foo/myroute.php(或例如.css,.js)会返回404 Not Found

我的nginx服务器配置:

server {
        listen          80;
        server_name     domain.com;
        root            /var/www/path/public;

        charset utf-8;
        gzip on;

        #access_log  logs/host.access.log  main;

        location / {
                index index.html index.php index.htm;
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        location ~ \.php$ {
                try_files                       $uri = 404;
                fastcgi_pass    unix:/var/run/php5-fpm.sock;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME  $request_filename;
                include         fastcgi_params;
        }

        location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
                add_header        Cache-Control public;
                add_header        Cache-Control must-revalidate;
                expires           7d;
                access_log off;
        }
}

为什么具有已知文件扩展名(/myroute.php)的网址不会像其他任何网址一样发送到我的index.php文件?

1 个答案:

答案 0 :(得分:5)

myroute.php在您的服务器上不存在。

按此顺序检查Nginx location指令

  
      
  1. 带有“=”前缀且与查询完全匹配的指令(文字字符串)。如果找到,则搜索停止。
  2.   
  3. 使用传统字符串的所有剩余指令。如果此匹配使用“^〜”前缀,则搜索停止。
  4.   
  5. 正则表达式,按照在配置文件中定义的顺序。
  6.   
  7. 如果#3产生匹配,则使用该结果。否则,使用#2的匹配
  8.   

这意味着您的myroute.php请求由~ \.php$位置块处理,根据您的try_files指令生成404.

要解决此问题,您需要使您的位置指令更具体(例如~ index\.php$),或者像location /中那样使用try_files。使用重写也可以解决您的问题。

编辑:

了解nginx选择位置块的顺序与其他位置块的关系非常重要。请参阅nginx wiki

了解更多信息

关于你的问题,我认为最简单的解决方案是使用try_files

    try_files $uri $uri/ /index.php?q=$uri&$args;

location ~ \.php$ {location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {块中

  • 注意:不要忘记从try_files $uri =404
  • 中删除旧的.php$

您的最终配置文件现在应该如下所示

server {
    listen          80;
    server_name     domain.com;
    root            /var/www/path/public;

    charset utf-8;
    gzip on;

    #access_log  logs/host.access.log  main;

    location / {
            index index.html index.php index.htm;
            try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    location ~ \.php$ {
            try_files $uri $uri/ /index.php?q=$uri&$args;
            fastcgi_pass    unix:/var/run/php5-fpm.sock;
            fastcgi_index   index.php;
            fastcgi_param   SCRIPT_FILENAME  $request_filename;
            include         fastcgi_params;
    }

    location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
            try_files  $uri $uri/ /index.php?q=$uri&$args;
            add_header        Cache-Control public;
            add_header        Cache-Control must-revalidate;
            expires           7d;
            access_log off;
    }
 }