Я пытаюсь настроить среду nginx, в которой устаревший код и новый код в стиле MVC могут сосуществовать, чтобы я мог постепенно реорганизовать его постранично. Устаревшему коду нужна более старая версия PHP (лучше всего работает на 5.3, но у меня возникли проблемы с компиляцией, поэтому я перешел с 5.4 и исправлю все, что сломалось), но его легко отличить по URL, потому что он имеет буквальные имена файлов лайк http://sub.domain.com/search.php?category=4
и т. д. вместо нового стиля, как http://sub.domain.com/search/category/4
— ключевым отличием является наличие .php
,
Новый код работает нормально со следующим в конфигурации nginx:
server {
listen 80;
server_name *.myproject.dev;
root /var/www/myproject/public;
index index.php index.html index.htm;
try_files $uri $uri/ @rewrite;
location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}
location ~ ^(.+\.php)(/.*)?$ {
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
}
}
(Я признаю, что я не совсем понимаю весь этот код — он взят из различных руководств и тому подобного.)
С помощью этот великий учебник Я скомпилировал и установил PHP 5.4 в своем собственном месте, прослушивая порт 9001. Он отлично работает, используя отдельный домен для старого кода, но я хочу использовать только один домен, но вызвать старый код, если .php
находится в URL, и сделайте необходимое переписать что-нибудь еще и используйте новый код. я нашел этот пост на ServerFault и попытался включить свои идеи в мою ситуацию следующим образом:
server {
listen 80;
server_name *.myproject.dev;
root /var/www/myproject/public;
index index.php index.html index.htm;
try_files $uri $uri/ @rewrite;
location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}
location ~ ^(.+\.php)(/.*)?$ {
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
# Anything with ".php" is directed to the old codebase
location ~* \.php {
root /var/www/myproject/oldcode;
fastcgi_pass 127.0.0.1:9001;
}
}
}
Но переписать добавляет index.php
к новому коду, так что, в конце концов, все соответствует .php
тест, который не является целью. Я попытался поместить эти последние четыре строки ранее в файл с несколькими вариантами, но это не помогло (либо пустая страница, либо все еще переход к старому расположению кода, в зависимости от деталей). Кто-нибудь знает достаточно о синтаксисе конфигурации nginx, чтобы помочь мне изменить его так, чтобы он делал то, что я хочу?
Если ваш новый код использует только /index.php
и без какой-либо path_info, вы можете использовать префикс местоположения:
location ^~ /index.php { ... }
location ~* \.php { ... }
Первое местоположение имеет приоритет из-за ^~
оператор. Или точное совпадение (которое также имеет приоритет):
location = /index.php { ... }
location ~* \.php { ... }
Других решений пока нет …