我们在 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
。