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

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

Благодарю.

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
}
Другие вопросы по тегам