У меня есть сценарий PHP, который обрабатывает маршрутизацию сценария и делает всевозможные причудливые вещи. Изначально он был разработан для Apache, но я пытаюсь перенести его на nginx для некоторых из своих ящиков. Прямо сейчас я пытаюсь сгладить ситуацию на тестовом сервере.
Таким образом, сценарий работает так, что он перехватывает весь HTTP-трафик для каталога (в Apache), используя .htaccess
файл. Вот как это выглядит:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+$ index.php [L]
</IfModule>
Довольно просто. Все запросы проходят через index.php
, легко и просто.
Я хочу имитировать это поведение на nginx, но я еще не нашел способа. У кого-нибудь есть предложения?
Вот копия моего nginx.conf
файл на данный момент. Обратите внимание, что он был разработан для меня, чтобы просто попытаться заставить его работать; в основном это копирование / вставка.
user www-data;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
# multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type text/plain;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name swingset.serverboy.net;
access_log /var/log/nginx/net.serverboy.swingset.access_log;
error_log /var/log/nginx/net.serverboy.swingset.error_log warn;
root /var/www/swingset;
index index.php index.html;
fastcgi_index index.php;
location ~ \.php {
include /etc/nginx/fastcgi_params;
keepalive_timeout 0;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}
}
Добавь это,
location / {
try_files $uri $uri/ /index.php;
}
Что он делает, так это сначала проверяет наличие $ uri и $ uri / как реальных файлов / папок, и, если они не существуют, просто проходит через /index.php (это моя настройка для Zend framework, где маршрутизация выполняется через индекс .php) - конечно, если вам нужно передать некоторые параметры, просто добавьте к /index.php a? q = в конце, и он передаст параметры.
Убедитесь, что директива try_file доступна начиная с версии 0.7.27 и выше.
Разобрался сам! Да!
Все, что мне нужно для location
блок был:
location / {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_pass 127.0.0.1:9000;
}
Все остальное осталось в основном прежним.
Чтобы сохранить аргументы GET, используйте следующее:
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
$ is_args преобразуется в '?' если $ args не пуст
Или еще проще:
location / {
try_files /index.php$is_args$args;
}
После установки корневого каталога добавьте это
if (!-e $request_filename)
{
rewrite ^/(.*)$ /index.php?/$1 last;
break;
}
В соответствии с вашими потребностями вы можете изменить регулярное выражение, поскольку вам нужно установить query_string на index.php
Одна очень важная ошибка, которую следует избегать, когда вашей целью является файл PHP, - убедиться, что все return
/ rewrite
правило, которое вы используете, не отменяет location ~ \.php
директива. Если это произойдет, nginx будет обслуживать ваш PHP-файл без его рендеринга, показывая исходный код PHP. Это может быть катастрофой.
Самый безопасный способ уже предоставлен, location / { try_files $uri $uri/ /index.php; }
Убедитесь, что вы также установили index index.php
в твоем location /
заблокировать и раскомментировать location ~ \.php
блок включен в файл конфигурации по умолчанию.