【问题标题】:NGINX configuration for static and PHP files静态和 PHP 文件的 NGINX 配置
【发布时间】:2016-03-22 23:28:23
【问题描述】:

我正在尝试配置 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;
        }
    }
}

【问题讨论】:

    标签: php html nginx


    【解决方案1】:

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

    location /api {
        root /var/www/mysite/src;
        ...
    }
    

    当出现 URI /api/index.php 时,将产生一个本地路径 /var/www/mysite/src/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;
    }
    

    详情请参阅this 和this。

    【讨论】:

    • 感谢您提供的非常有帮助的答案。主要问题是 /api 位置块中根的定义。
    猜你喜欢
    • 2022-06-11
    • 2019-05-07
    • 2017-11-25
    • 1970-01-01
    • 2023-04-04
    • 2020-03-07
    • 2016-03-12
    • 1970-01-01
    • 2015-02-19
    相关资源
    最近更新 更多