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;
        }
    }
}
