Я впервые настраиваю сервер nginx, и у меня возникли проблемы с правильностью правил перезаписи для nginx.
Мы использовали следующие правила Apache:
Посмотрите, настоящий ли это файл или каталог, если да, обслужите его, а затем отправьте все запросы для /
к Director.php
DirectoryIndex Director.php
Если URL-адрес имеет один сегмент, передайте его как rt
RewriteRule ^/([a-zA-Z0-9\-\_]+)/$ /Director.php?rt=$1 [L,QSA]
Если URL-адрес состоит из двух сегментов, передайте его как rt
и action
RewriteRule ^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$ /Director.php?rt=$1&action=$2 [L,QSA]
Мой файл конфигурации nginx выглядит так:
server {
...
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Как мне получить сегменты URL-адреса в параметрах строки запроса, как в правилах Apache выше?
ОБНОВЛЕНИЕ 1
Пробуем подход Поти:
# serve static files directly
location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|html)$ {
access_log off;
expires 30d;
}
location / {
try_files $uri $uri/ /Director.php;
rewrite "^/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1" last;
rewrite "^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1&action=$2" last;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Это производит вывод No input file specified.
по каждому запросу. Я не понимаю, если .php
location запускается (и впоследствии передается в php), когда перезапись в любом блоке указывает на файл .php или нет.
ОБНОВЛЕНИЕ 2
Я все еще не понимаю, как настроить эти блоки местоположения и передать параметры.
location /([a-zA-Z0-9\-\_]+)/ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME ${document_root}Director.php?rt=$1{$args};
include fastcgi_params;
}
ОБНОВЛЕНИЕ 3
Похоже, что корневая директива отсутствовала, что привело к No input file specified.
сообщение. Теперь, когда это исправлено, я получаю индексный файл, как если бы URL-адрес был /
по каждому запросу независимо от количества сегментов URL.
Похоже, что мое регулярное выражение местоположения игнорируется.
Моя текущая конфигурация:
# This location is ignored:
location /([a-zA-Z0-9\-\_]+)/ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index Director.php;
set $args $query_string&rt=$1;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location / {
try_files $uri $uri/ /Director.php;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index Director.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Заявление об ограничении ответственности: ни одно из следующего не протестировано. Пожалуйста, используйте его с осторожностью. Если что-то пойдет не так, включите отладку, как указано на http://nginx.org/en/docs/debugging_log.html .
See if it's a real file or directory, if so, serve it,
then send all requests for / to Director.php
Этого можно достичь с помощью ...
server {
index Directory.php;
location / {
try_files $uri $uri/ /Directory.php;
}
}
В index
директивы достаточно для индексации каталога. Для отправки всех запросов в Director.php необходим блок местоположения.
If the URL has one segment, pass it as rt
Вы можете попробовать следующее ...
rewrite "^/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1" last;
Пожалуйста, помните цитаты вокруг рерайтов. Желательно использовать кавычки и это необходимо при определенных условиях (это упомянуто в ссылке, предоставленной ранее @jerm).
If the URL has two segments, pass it as rt and action
Вы можете попробовать следующее ...
rewrite "^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1&action=$2" last;
Обратите внимание, что в приведенных выше примерах я ничего не делал для QSA. Вы можете попробовать $args
в Nginx, чтобы передать существующую строку запроса в новую строку запроса. Ссылка: http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
Я надеюсь, что это поможет прийти к полностью рабочему решению!
Это хороший учебник по захвату регулярных выражений как переменных в расположениях nginx.