需要帮助将此htaccess重写规则转换为Nginx

时间:2012-07-17 15:56:13

标签: apache .htaccess cakephp mod-rewrite nginx

嗨 - 我好几天都在苦苦挣扎。这似乎很简单,但我无法完成它。

我有一个在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,因为我认为它更适合那里,但没有得到答案,这也是我在这里发布的原因。

1 个答案:

答案 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
}