簡體   English   中英

用於靜態和PHP文件的NGINX配置

[英]NGINX configuration for static and PHP files

我正在嘗試配置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;
        }
    }
}

最初的問題是location /api塊中的root指令,該指令不應包含位置組件,因為它作為URI的一部分附加,因此:

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

當提供URI /api/index.php時,將生成/var/www/mysite/src/api/index.php的本地路徑。 請參閱此文檔了解詳細信息

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;
}

這個這個有關詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM