Назад | Перейти на главную страницу

Нужна помощь в переводе этого правила перезаписи htaccess на 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, чтобы контролировать, какой контроллер что посещает.

Любая помощь будет оценена по достоинству.

Спасибо.

Итак, я наконец заработал:

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
}