Привет, я борюсь с этим несколько дней. Это кажется простым, но я просто не могу этого сделать.
У меня есть сайт, разработанный в 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
}