用于静态和PHP文件的NGINX配置

时间:2016-03-22 13:28:30

标签: php html nginx

我正在尝试配置nginx以提供静态和PHP文件。我的配置不起作用。我想要以下本地文件夹结构:

src/static/  -> contains HTML, CSS, JS, images etc
src/api/     -> contains PHP files for a small REST service

如果我访问http://mysite.local我希望从/ static文件夹中获取文件。如果我访问http://mysite.local/api我希望获得API PHP文件。我希望重写api的请求并将其发送到index.php文件。

一些例子:

http://mysite.local/test.html                   -> served from src/static/test.html
http://mysite.local/images/something.png        -> served from src/static/images/something.png
http://mysite.local/css/style.css               -> served from src/static/css/style.css

http://mysite.local/api/users                   -> served from src/api/index.php?users
http://mysite.local/api/users/bob               -> served from src/api/index.php?users/bob
http://mysite.local/api/biscuits/chocolate/10   -> served from src/api/index.php?biscuits/chocolate/10

以下配置适用于静态文件,但不适用于api文件。如果我访问其中一个API路径,我会收到404错误。

server {
    listen       80;
    server_name  mysite.local;
    access_log   /var/log/nginx/mysite.access.log main;
    error_log    /var/log/nginx/mysite.error.log debug;


    location / {
        index index.html;
        root /var/www/mysite/src/static;
        try_files $uri $uri/ =404;
    }

    location /api {
        index index.php;
        root /var/www/mysite/src/api;
        try_files $uri $uri/ /index.php?$query_string;

        location ~ \.php$ {
            try_files      $uri = 404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

最初的问题是root块中的location /api指令,该指令不应包含位置组件,因为它作为URI的一部分附加,因此:

location /api {
    root /var/www/mysite/src;
    ...
}
当提供URI /var/www/mysite/src/api/index.php时,

将导致/api/index.php的本地路径。有关详细信息,请参阅this document

try_files规则不会重写您在示例中指定的URI。如果您确实需要将URI的最终路径显示为/api/index.php的查询字符串,则需要使用rewrite

最简单的解决方案(如果您不需要从该位置提供静态内容)是将try_files替换为:

location /api {
    ...
    rewrite ^/api/(.*)$ /api/index.php?$1 last;

    location ~ \.php$ { ... }
}

否则,请使用命名位置:

location /api {
    ...
    try_files $uri $uri/ @rewrite;

    location ~ \.php$ { ... }
}
location @rewrite {
    rewrite ^/api/(.*)$ /api/index.php?$1 last;
}

有关详细信息,请参阅thisthis