嗨 - 我好几天都在苦苦挣扎。这似乎很简单,但我无法完成它。
我有一个在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控制控制器参与什么所需要的。
更新:REQUEST_URI
值是正确的......这里的问题是Cake查找不同服务器变量的值来决定哪个控制器会响应。按此顺序:$_SERVER['PATH_INFO']
,$_SERVER['REQUEST_URI']
,$_SERVER['PHP_SELF']
和$_SERVER['SCRIPT_NAME']
以及最后$_SERVER['HTTP_X_REWRITE_URL']
的组合。这就是它失败的原因。
任何帮助将不胜感激。
感谢。
注意:我昨天发布了this question on Serverfult,因为我认为它更适合那里,但没有得到答案,这也是我在这里发布的原因。
答案 0 :(得分: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
}