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