Nginx – jak správně na front controller s php-fpm?
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Jan Mikeš
- Člen | 771
Ahoj, půl dne bojuji s nastavením front controlleru v nginxu a rozběhnutí nette → přesměrování všeho na index.php
Problém je v tom, že pokud jde request na neexistující soubor s příponou .php, nginx ho nepřesměruje správně na index.php.
/
→ v pořádku
/index.php
→ v pořádku
/existujici-url/
→ v pořádku
/neexistujici-url/
→ v pořádku, zpracovává error
presenter
/neexistujici-url.php
→ chyba, nginx 404
nginx.conf:
worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
access_log /dev/null;
error_log /usr/local/var/log/nginx/error.log;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
listen 443 ssl http2;
ssl_certificate ssl/nginx.crt;
ssl_certificate_key ssl/nginx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
server_name _;
server_tokens off;
index index.php index.html index.htm;
set $basepath "/Users/janmikes/Sites";
set $domain $host;
if ($domain ~* "^([\w\d\-]*)\.dev$") {
set $domain $1;
}
if ($domain ~* "^([\w\d\-]*)\.([\w\d\-]*)\.dev$") {
set $domain $2;
}
set $rootpath "${domain}";
if (-d $basepath/$domain/www) {
set $rootpath "${domain}/www";
}
root $basepath/$rootpath;
location ~ /\.|^\. {
deny all;
}
location ~ \.(neon|ini|log|yml)$ {
deny all;
}
location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico|txt|bmp|pdf|doc|docx|ppt|pptx|zip)$ {
access_log off;
log_not_found off;
expires max;
}
location = /robots.txt { access_log off; log_not_found off; }
location = /humans.txt { access_log off; log_not_found off; }
location = /favicon.ico { access_log off; log_not_found off; }
location ~* [^/]\.php(/|$) {
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index $document_root/index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root/$fastcgi_path_info;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ index.php$is_args$args;
}
}
}
fastcgi.conf:
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
Zkoušel jsem už asi triliardu variant, ale stále nechce fungovat. Nejhorší je, že vím přesně jaký je problém, ale řešení, která ostatním fungují mě nefungují :D.
Výstup z error logs:
2017/02/01 02:25:02 [error] 8602#0: *86 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: _, request: "GET /xyz.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "abc.dev"
Tuto chybu chápu tak, že nedokáže najít žádný ze souborů definovaný
v try_files
Editoval Jan Mikeš (1. 2. 2017 2:32)