0

嗨 - 我已经为此苦苦挣扎了好几天。这看起来很简单,但我就是做不到。

我有一个用 CakePHP 开发的网站。有一个响应的脚本/css/profiles/g/whatever.css(“whatever”是什么,它实际上是一个传递给动作的参数),它回显生成的 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_uriCakePHP 需要控制什么控制器参与什么。

更新REQUEST_URI值是正确的......这里的问题是Cake 寻找不同服务器变量的值来决定哪个控制器将响应。按此顺序:$_SERVER['PATH_INFO'], , and和 finally$_SERVER['REQUEST_URI']的组合。这就是它失败的原因。$_SERVER['PHP_SELF']$_SERVER['SCRIPT_NAME']$_SERVER['HTTP_X_REWRITE_URL']

任何帮助将不胜感激。

谢谢。

注意:我昨天在 Serverfult 上发布了这个问题,因为我认为它更适合那里但没有得到答案,这就是我在这里发布它的原因。

4

1 回答 1

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
}
于 2012-07-18T01:54:37.653 回答