nginx配置php接口多版本,不同版本指向不同目录

问一个nginx配置php的问题

server {
    listen       80;
    server_name t.timophp.com;

    charset utf-8;
    access_log off;
    
    location /v1 {
        root /data/a/b;
        index   index.php index.html index.htm;
        if (!-e $request_filename) {
            rewrite ^/v1/(.*)$ /index.php/$1 last;
        }
    }

    location /v2/ {
        root /data/c/d;
        index   index.php index.html index.htm;
        if (!-e $request_filename) {
            rewrite ^/v2/(.*)$ /index.php/$1 last;
        }
    }

    location ~ \.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_pass   unix:/dev/shm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        include        fastcgi_params;
    }
    
    location ~ /\.ht {
        deny  all;
    }
}

一个域名下面配置多个版本接口
版本一

路径/data/a/b

版本二

路径/data/c/d

版本三

路径/data/e/f

按照我的配置行不通

阅读 5.6k
5 个回答

你这个是报404了
因为并不知道你的 /index.php 是在哪个目录
把access_log打开,加上error_log看看吧

试下以下配置

server {
    listen       80;
    server_name t.timophp.com;

    charset utf-8;
    access_log off;

    location /v1/ {
        alias /data/a/b/;
        index   index.php index.html index.htm;
        if (!-e $request_filename) {
            rewrite ^/v1/(.*)$ /index.php/$1 last;
        }
        location ~ \.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_pass   unix:/dev/shm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO        $fastcgi_path_info;
            include        fastcgi_params;
        }
    }

    location /v2/ {
        alias /data/c/d/;
        index   index.php index.html index.htm;
        if (!-e $request_filename) {
            rewrite ^/v2/(.*)$ /index.php/$1 last;
        }
        location ~ \.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_pass   unix:/dev/shm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO        $fastcgi_path_info;
            include        fastcgi_params;
        }
    }

    location ~ /\.ht {
        deny  all;
    }
}
新手上路,请多包涵

rewrite

除了 nginx 里配置,其实还有2种思路:

把 v1, v2 作为 module;

入口文件里重写:

if (preg_match('/^\/v(\d+)/', $_SERVER['REQUEST_URI'], $matches)) {
    $arr = [
        1 => '/data/a/b',
        2 => '/data/c/d',
    ];
    include $arr[$matches[1]] . '/index.php';
}
新手上路,请多包涵

PHP的版本配置怎么放啊?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏