Назад | Перейти на главную страницу

Правило перезаписи nginx для преобразования сегментов URL в параметры строки запроса

Я впервые настраиваю сервер 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.

http://nginx.org/en/docs/http/server_names.html#regex_names