嗨——我已经为此苦苦挣扎了好几天。这看起来很简单,但我就是做不出来。
我有一个用 CakePHP 开发的网站。有一个脚本可以响应/css/profiles/g/whatever.css
(“无论”是无论什么,它实际上是传递给操作的一个参数),它会回显生成的 CSS 并将其保存到/css/profiles/whatever.css
。
我在 Apache 中有一个规则,它接受请求/css/profiles/whatever.css
,如果不存在,则将请求重写为/css/profiles/g/whatever.css
而不重定向,因此客户端永远不会注意到它是由脚本响应的并且文件不存在。
这是我在 Apache 中所拥有的:
# Profile CSS rules
RewriteCond %{REQUEST_URI} ^/css/profiles/
RewriteCond %{REQUEST_URI} !/css/profiles/g/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^css/profiles/(.*)$ /css/profiles/g/$1 [L]
# CakePHP's default rules
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,L]
现在我正在将网站移至具有 Nginx 的服务器,到目前为止我得到了以下信息:
# Profile CSS rules
location ~ ^/css/profiles/(?!g/)(.*)$ {
if (!-f $request_filename) {
rewrite ^/css/profiles/(.*)$ /css/profiles/g/$1 last;
break;
}
}
# CakePHP's default rules
location / {
try_files $uri $uri/ /index.php?$uri&$args; }
这些条件似乎有效,因为如果我去/css/profiles/whatever.css
打印出 PHP 的$_SERVER
变量,它会给我
[QUERY_STRING] => /css/profiles/g/whatever.css&
注意&
。这意味着它到达了该try_files
部分并将添加到$uri
查询字符串中,并且它具有正确的$uri
。
但...
[REQUEST_URI] => /css/profiles/whatever.css
这就是问题所在。看来它并没有真正改变$request_uri
CakePHP 需要控制哪个控制器参与什么。
任何帮助将不胜感激。
谢谢。
答案1
所以我终于让它工作了:
location ~ ^/css/profiles/(?!g/)(.*)$ {
set $new_uri /css/profiles/g/$1;
if (!-f $request_filename) {
rewrite ^/css/profiles/(.*)$ /css/profiles/g/$1 last;
}
}
...最后:
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
... some other stuff were here related to fastcgi
fastcgi_param PATH_INFO $new_uri; # <--- I added this
}