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

nginx fastcgi rewrite: первичный скрипт неизвестен

У меня следующая конфигурация nginx:

  location / {
      try_files $uri $uri/ index.html =404;

      if (!-e $request_filename) {
        rewrite ^/(.+)$ index.php?url=$1 last;
      }
  }


 location ~ .php$ {
    # protection from known vulnerability
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_index  index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 }

(fastcgi_params являются значениями по умолчанию из пакета Debian)

это работает по запросу /, однако при перезаписи запроса основной файл не обнаруживается:

запрос /contact который следует переписать на /index.php?url=contact

 *104 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 10.0.0.1, server: localhost, request: "GET /contact HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "localhost:8080"

Я не могу получить из журналов, что на самом деле пытается загрузить fastcgi, какой путь?

Обратите внимание, что index.php и /index.php - это разные URI. Вы забыли косые черты в своих переписываниях.

Это лучший способ реализовать ту же функциональность:

location / {
    try_files $uri $uri/ @rewrite;
}

location @rewrite {
    rewrite ^/(.+)$ /index.php?url=$1 last;
}

а затем ваш блок местоположения PHP, как в вашей настройке.

try_files сначала проверяет, существует ли файл, соответствующий $ uri, затем каталог, и если ни один не существует, он использует rewrite -location, который запускает сценарий.

Наиболее вероятной причиной того, что ваша установка не работала, было отсутствие / из пути к сценарию перезаписи. В любом случае, эта настройка проще и предпочтительнее для nginx.