fastcgi_cache_path /path/to/cache levels=1:2 keys_zone=redirects_prod:10m; server { listen 80; server_name hostname; server_name_in_redirect off; set $web_root /web/root/; root $web_root; error_log /var/log/nginx/prod_error.log warn; access_log /var/log/nginx/prod_access.log main_ext; set $prerender_fallback_file index.html; error_page 404 /404.html; add_header X-Cache $upstream_cache_status; location /api { try_files $uri /app.php$is_args$args; } location / { try_files $uri $uri/ @redirect; } location = / { try_files asdfg @redirect; } # PROD location ~ ^/app\.php(/|$) { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; #include fastcgi_cache; #fastcgi_cache fcgi_cache; internal; } location @redirect { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; set $redirect_script /redirect.php; fastcgi_param SCRIPT_FILENAME $realpath_root$redirect_script; fastcgi_param DOCUMENT_ROOT $realpath_root; fastcgi_cache_key "$request_uri_without_query"; fastcgi_cache_valid 301 302 418 24h; fastcgi_cache_bypass $arg_test_spa $arg_preview_code; fastcgi_no_cache $arg_test_spa $arg_preview_code; fastcgi_cache redirects_prod; error_page 418 =200 @prerender; error_page 502 =200 @prerender; error_page 404 /404.html; } location @prerender { set $prerender 0; if ($http_user_agent ~* "yandex|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") { set $prerender 1; } if ($args ~ "_escaped_fragment_") { set $prerender 1; } if ($http_user_agent ~ "Prerender") { set $prerender 0; } if ($uri ~ "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff)") { set $prerender 0; } if ($prerender = 1) { rewrite .* /$scheme://$host$request_uri? break; proxy_pass http://$prerender_host; } if ($prerender = 0) { rewrite .* /$prerender_fallback_file break; } } }