将 Apache mod_proxy [P] 转换为 Nginx 等效项

将 Apache mod_proxy [P] 转换为 Nginx 等效项

我们在 Apache 中已经实现了这一点。您可以看到这里

$request_uri

/h_32/w_36/test.jpg

需要路由至

/index.php/img/i/h_32/w_36/test.jpg

index.php会将请求路由到img控制器和i方法,然后处理图像并返回。但是,我的 MVC 依靠 工作REQUEST_URI。因此,简单地重写 URL 不起作用。需要REQUEST_URI修改 。

您可以在最后一个位置块中看到我传入了修改后的REQUEST_URI,但 Nginx 正在尝试打开/var/www/vhosts/ezrshop.com/htdocs/h_32/w_36/test.jpg(请参阅错误日志下面)并抛出 404。

Nginx 难道不应该尝试将其发送给处理吗index.php?为什么是 404?

root /var/www/vhosts/example.com/htdocs;
index index.php index.html;

set $request_url $request_uri;

location ~ (h|w|fm|trim|fit|pad|border|or|bg)_.*\.(jpg|png)$ {
    if ($request_uri !~ "/img/i/") {
            set $request_url /index.php/img/i$1.$2;
    }

    try_files $uri $uri/ /index.php/img/i$1.$2;
}

location / {
        try_files $uri $uri/ /index.php$uri?$args;
}

location ~ ^(.+\.php)(.*)$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  CI_ENV production; #CI environment constant
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param  REQUEST_URI $request_url;
}

错误日志:

日志 1:

/img/i/ does not match /h_32/w_36/test.jpg, request: GET /h_32/w_36/test.jpg HTTP/1.1

日志 2:

open() "/var/www/vhosts/ezrshop.com/htdocs/h_32/w_36/test.jpg" failed (2: No such file or directory), request: "GET /h_32/w_36/test.jpg HTTP/1.1"

答案1

这是解决方案。

root /var/www/vhosts/example.com/htdocs;
index index.php index.html;

location ~ ^/(h|w|fm|trim|fit|pad|border|or|bg)_.*\.(jpg|png)$ {
    include fastcgi_params;
    # route to /img/i/
    fastcgi_param REQUEST_URI /img/i$uri;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    fastcgi_param CI_ENV production; #CI environment constant
    fastcgi_pass  127.0.0.1:9000;
}

location / {
    try_files $uri $uri/ /index.php$uri?$args;
}

location ~ ^(.+\.php)(.*)$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  CI_ENV production; #CI environment constant
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include fastcgi_params;
}

答案2

我将采用以下方法:

location ~* ^/_img/(h|w|fm|trim|fit|pad|border|or|bg)(_.+\.)(jpg|png)$ {
    try_files $uri $uri/ /index.php/img/i/$1$2$3?$args;
}

我们在指令中使用正则表达式location将我们想要的部分捕获到变量中,然后使用这些变量进行重写。

由于location正则表达式定义得过于详细,因此它不会匹配重写的位置。但是,这里我们将更改后的 URL 直接传递给try_files

相关内容