Js Css和图像的Nginx 403错误

时间:2013-03-22 19:07:41

标签: nginx

我正在尝试在服务器上进行magento安装。这是我的Vhost文件。

server {
    listen 80;
    ## SSL directives might go here
    server_name development.magento.in ; ## Domain is here twice so server_name_in_redirect will favour the www
    root /var/www/devcode/;

    client_max_body_size 2M;

    location / {
            index index.html index.php; ## Allow a static html file to be shown first
            try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler
            expires 365d; ## Assume all files are cachable
    }

    if ($request_uri = /index.php) {
            rewrite ^ http://$host? permanent;
    }

    location /app/                { deny all; }
    location /includes/           { deny all; }
    location /lib/                { deny all; }
    location /media/downloadable/ { deny all; }
    location /pkginfo/            { deny all; }
    location /report/config.xml   { deny all; }
    location /shell/              { deny all; }
    location /downloader/         { deny all; }
    location /cron.php            { deny all; }

    location ~ .php/ { ## Forward paths like /js/index.php/x.js to relevant handler
       rewrite ^(.*.php)/ $1 last;
   }

    location  /. { ## Disable .htaccess and other hidden files
            return 404;
    }

    location @handler { ## Magento uses a common front handler
        rewrite / /index.php;
    }

    # serve static files directly

    location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|html|txt)$ {
        # root /var/www/devcode/skin/; # I tried to added to this also but never worked
        access_log        off;
        expires           30d;
    }

location ~ \.php$
{
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_read_timeout 300;
}

}

因此,通过此配置,Nginx显示 403用于Css和js以及图像。有趣的是,如果我删除了提供静态文件的部分,则会显示 404 。 我已经尝试过Stackoverflow上的所有帖子。 这是我的媒体和皮肤目录权限的样子

drwxr-xr-x. 23 nginx  nginx   4096 Mar 22 14:32     media
drwxr-xr-x.  5 nginx  nginx   4096 Mar 13 03:45     skin

任何帮助或提示都会受到高度尊重!


修改

我的新配置文件就是这样:

server {
    listen 80;
    ## SSL directives might go here
    server_name development.magento.in ; ## Domain is here twice so server_name_in_redirect will favour the www
    root /var/www/devcode/;

    index   index.html index.php; ## Allow a static html file to be shown first

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    include        /etc/nginx/fastcgi_params;

    access_log /var/log/nginx/development.access.log ;
    error_log  /var/log/nginx/development.error.log ;

    client_max_body_size 2M;

    location / {
            try_files $uri $uri/  /index.php?$args;   #@handler; ## If missing pass the URI to Magento's front handler
            expires 365d; ## Assume all files are cachable
    }

    if ($request_uri = /index.php) {
            rewrite ^ http://$host? permanent;
    }

    location ^~ /(app|includes|lib|media/downloadable|pkginfo|var)/ { internal; }
    location /var/export/ { internal; }

    location ~ .php/ { ## Forward paths like /js/index.php/x.js to relevant handler
       rewrite ^(.*.php)/ $1 last;
    }

    location  /. { ## Disable .htaccess and other hidden files
            return 404;
    }

    # serve static files directly
    location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|html|txt)$ {
        access_log        off;
        expires           30d;
    }

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;

        fastcgi_index index.php;
        fastcgi_param MAGE_RUN_CODE default;
        fastcgi_param MAGE_RUN_TYPE store;
        fastcgi_read_timeout 300;
    }

 }

现在我的上一期是固定的。但现在我无法让我的网站运行。我已经检查了access.log,它说HTTP 200 OK但是index.php没有收到任何请求。

1 个答案:

答案 0 :(得分:2)

您可以简单地将alias指令用于静态文件:

location /skin {
    alias /var/www/devcode/skin;
    access_log        off;
    expires           30d;
}

或更明确地

location /skin/ {
    alias /var/www/devcode/skin/;
    access_log        off;
    expires           30d;
}

(见两端的正斜线差异......)

嗯,你实际上也可以用root指令来做,但最后一个正斜杠太多了。查看aliasroot here之间的区别。我仍然建议使用alias代替root,因为它有明显的理由来提供静态并且仅在location级别上受支持。

无论我的回答如何,我都会说这个配置看起来像是来自apache重写逻辑而不是整体上优化得很好的nginx风格。您可能希望将上面显示的静态内容分隔到不同的子文件夹中。那么你也可能想知道为什么If is Evil。您可以try files

而不是在@handler中重写
location @handler { ## Magento uses a common front handler
    try_files       $uri $uri/ /index.php?$args;
}

我无法为deny all提出更明智的想法。但是,我会将public文件夹中的php和静态内容分开并将其定义为root,将这些deny放在首位。请注意,如果这些建议与您的特定需求相冲突,其中一些建议可能听起来毫无意义。