# nginx_system_test.sh makes a few substitutions to pagespeed_test.conf.template
# file to generate @@TEST_TMP@@/pagespeed_test.conf

# The cache flush test depends on worker_processes=1.
worker_processes  1;

daemon @@DAEMON@@;
master_process on;

error_log "@@ERROR_LOG@@" debug;
pid "@@TEST_TMP@@/nginx.pid";

events {
  worker_connections  1024;
}


http {
  server_names_hash_bucket_size 128;

  log_format cache '$time_local '
                   '$upstream_cache_status '
                   '$http_host $request ($status) '
                   '"$http_user_agent"';
  access_log "@@ACCESS_LOG@@" cache;

  # Don't put entries in the error log for 403s and 404s.
  log_not_found off;

  proxy_cache_path "@@PROXY_CACHE@@"  levels=1:2   keys_zone=htmlcache:60m inactive=90m  max_size=50m;
  proxy_temp_path "@@TMP_PROXY_CACHE@@";

  pagespeed ProcessScriptVariables all;
  pagespeed StatisticsPath /ngx_pagespeed_statistics;
  pagespeed GlobalStatisticsPath /ngx_pagespeed_global_statistics;
  pagespeed ConsolePath /pagespeed_console;
  pagespeed MessagesPath /ngx_pagespeed_message;
  pagespeed AdminPath /pagespeed_admin;
  pagespeed GlobalAdminPath /pagespeed_global_admin;

  pagespeed StaticAssetPrefix /pagespeed_custom_static/;

  pagespeed MessageBufferSize 200000;
  # Increase the default fetcher timeout to resolve sporadic flakeyness when
  # the native fetcher uses 8.8.8.8 to resolve.
  pagespeed FetcherTimeoutMs 10000;
  pagespeed NativeFetcherMaxKeepaliveRequests 50;

  root "@@SERVER_ROOT@@";

  # Block 5a: Decide on Cache-Control header value to use for outgoing
  # response.
  # Map new_cache_control_header_val to "no-cache, max-age=0" if the
  # content is html and use the original Cache-Control header value
  # in all other cases.
  map $upstream_http_content_type $new_cache_control_header_val {
    default $upstream_http_cache_control;
    "~*text/html" "no-cache, max-age=0";
  }

  pagespeed UsePerVHostStatistics on;
  pagespeed InPlaceResourceOptimization on;
  pagespeed CreateSharedMemoryMetadataCache "@@SHM_CACHE@@" 8192;
  pagespeed BlockingRewriteKey psatest;

  # We need to checkpoint more frequently than usual so that our checkpointing
  # test will definitly have seen one of these intervals and so not be flaky.
  # This needs to have a 1s interval because the checkpointing test has a 2s
  # sleep.
  pagespeed ShmMetadataCacheCheckpointIntervalSec 1;

  # CriticalImagesBeaconEnabled is now on by default, but we disable in testing.
  # With this option enabled, the inline image system test will currently fail.
  # When critical image beaconing is enabled, only critical images are inlined.
  # In our current system test, we aren't yet sending a beacon to identify the
  # critical images to be inlined, so we just disable the option here.
  pagespeed CriticalImagesBeaconEnabled false;

  # By default, resources will not be used for inlining without explicit
  # authorization. Supported values are off or a comma-separated list of strings
  # from {Script,Stylesheet}.
  pagespeed InlineResourcesWithoutExplicitAuthorization off;

  pagespeed Statistics on;
  pagespeed StatisticsLogging on;
  pagespeed LogDir "@@TEST_TMP@@/logdir";

  # Expanded to CentralControllerPort directive when RUN_CONTROLLER_TEST=on
  @@CONTROLLER@@

  server {
    # This is the default vhost for @@SECONDARY_PORT@@
    # Your request will land here when you pass in an unknown host.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name default.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel CoreFilters;
  }

  server {
    # Sets up a logical home-page server on
    # max-cacheable-content-length.example.com.  This server is only used to
    # test ModPagespeedMaxCacheableContentLength, i.e.,
    # max_cacheable_response_content_length.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name max-cacheable-content-length.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";


    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_javascript;
    pagespeed MaxCacheableContentLength 85;
  }

  # Test how load from file handles maximum sizes.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name lff-large-files.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed MaxCacheableContentLength 4096;
    pagespeed LoadFromFile
      "http://lff-large-files.example.com/"
      "@@SERVER_ROOT@@/";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name lff-large-files-no-fallback.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed MaxCacheableContentLength 4096;
    # http://lff-large-files-no-fallback.example.com/foo.css won't load, because
    # we've configured a LoadFromFile pattern that doesn't match the path the
    # webserver would take.
    pagespeed LoadFromFile
      "http://lff-large-files-no-fallback.example.com/"
      "@@SERVER_ROOT@@/mod_pagespeed_example/styles/";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name pagespeed-off.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed off;
    pagespeed EnableFilters collapse_whitespace;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name pagespeed-on.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed on;
    pagespeed EnableFilters collapse_whitespace;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name pagespeed-standby.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed standby;
    pagespeed EnableFilters collapse_whitespace;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name pagespeed-unplugged.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed unplugged;
    pagespeed EnableFilters collapse_whitespace;
  }

  pagespeed UseNativeFetcher "@@NATIVE_FETCHER@@";
  @@RESOLVER@@

  server {
    # Block 1:  Basic port, server_name definitions.
    # This server represents the external caching layer server which
    # receives user requests and proxies them to the upstream server
    # running on the PRIMARY_PORT when the response is not available in
    # the cache. It also services purge requests from the upstream server.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name proxy_cache.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    # Disable PageSpeed on this server.
    pagespeed off;

    # Block 2: Define prefix for proxy_cache_key based on the UserAgent.

    # Define placeholder PS-CapabilityList header values for large and small
    # screens with no UA dependent optimizations. Note that these placeholder
    # values should not contain any of ll, ii, dj, jw or ws, since these
    # codes will end up representing optimizations to be supported for the
    # request.
    set $default_ps_capability_list_for_large_screens "LargeScreen.SkipUADependentOptimizations";
    set $default_ps_capability_list_for_small_screens "TinyScreen.SkipUADependentOptimizations";

    # As a fallback, the PS-CapabilityList header that is sent to the upstream
    # PageSpeed server should be for a large screen device with no browser
    # specific optimizations.
    set $ps_capability_list $default_ps_capability_list_for_large_screens;

    # Cache-fragment 1: Desktop User-Agents that support lazyload_images (ll),
    # inline_images (ii) and defer_javascript (dj).
    # Note: Wget is added for testing purposes only.
    if ($http_user_agent ~* "Chrome/|Firefox/|MSIE |Safari|Wget") {
      set $ps_capability_list "ll,ii,dj:";
    }
    # Cache-fragment 2: Desktop User-Agents that support lazyload_images (ll),
    # inline_images (ii), defer_javascript (dj), webp (jw) and lossless_webp
    # (ws).
    if ($http_user_agent ~*
        "Chrome/[2][3-9]+\.|Chrome/[3-9][0-9]+\.|Chrome/[0-9]{3,}\.") {
      set $ps_capability_list "ll,ii,dj,jw,ws:";
    }
    # Cache-fragment 3: This fragment contains (a) Desktop User-Agents that
    # match fragments 1 or 2 but should not because they represent older
    # versions of certain browsers or bots and (b) Tablet User-Agents that
    # correspond to large screens. These will only get optimizations that work
    # on all browsers and use image compression qualities applicable to large
    # screens. Note that even Tablets that are capable of supporting inline or
    # webp images, e.g. Android 4.1.2, will not get these advanced
    # optimizations.
    if ($http_user_agent ~* "Firefox/[1-2]\.|MSIE [5-8]\.|bot|Yahoo!|Ruby|RPT-HTTPClient|(Google \(\+https\:\/\/developers\.google\.com\/\+\/web\/snippet\/\))|Android|iPad|TouchPad|Silk-Accelerated|Kindle Fire") {
      set $ps_capability_list $default_ps_capability_list_for_large_screens;
    }
    # Cache-fragment 4: Mobiles and small screen Tablets will use image compression
    # qualities applicable to small screens, but all other optimizations will be
    # those that work on all browsers.
    if ($http_user_agent ~* "Mozilla.*Android.*Mobile*|iPhone|BlackBerry|Opera Mobi|Opera Mini|SymbianOS|UP.Browser|J-PHONE|Profile/MIDP|portalmmm|DoCoMo|Obigo|Galaxy Nexus|GT-I9300|GT-N7100|HTC One|Nexus [4|7|S]|Xoom|XT907") {
      set $ps_capability_list $default_ps_capability_list_for_small_screens;
    }

    # Block 3a: Bypass the cache for .pagespeed. resource. PageSpeed has its own
    # cache for these, and these could bloat up the caching layer.
    if ($uri ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+") {
      set $bypass_cache "1";
    }

    # For testing purposes, we never generate values that will result in a beacon
    # unless a test request it via "X-Allow-Beacon: yes" in its request header.
    # This is for testing purposes, note that in a production environment,
    # you want 'set_random $rand 0 100;' unconditionally!
    set $rand 5;

    if ($http_x_allow_beacon ~ "yes") {
      set_random $rand 0 100;
    }
    set $should_beacon_header_val "";
    if ($rand ~* "^[0-4]$") {
      set $should_beacon_header_val "random_rebeaconing_key";
      set $bypass_cache 1;
    }

    # Block 3b: Only cache responses to clients that support gzip.  Most clients
    # do, and the cache holds much more if it stores gzipped responses.
    if ($http_accept_encoding !~* gzip) {
      set $bypass_cache "1";
    }

    # Block 4: Location block for purge requests.
    location ~ /purge(/.*) {
      allow 127.0.0.1;
      allow ::1;
      deny all;
      proxy_cache_purge htmlcache $ps_capability_list$1$is_args$args;
    }

    # Block 6: Location block with proxy_cache directives.
    location /mod_pagespeed_test/cachable_rewritten_html/ {
      # 1: Upstream PageSpeed server is running at localhost:@@PRIMARY_PORT@@.
      proxy_pass http://localhost:@@PRIMARY_PORT@@;
      # 2: Use htmlcache as the zone for caching.
      proxy_cache htmlcache;
      # 3: Bypass requests that correspond to .pagespeed. resources
      # or clients that do not support gzip etc.
      proxy_cache_bypass $bypass_cache;
      # 4: Use the redefined proxy_cache_key and make sure the /purge/
      # block uses the same key.
      proxy_cache_key $ps_capability_list$uri$is_args$args;
      # 5: Forward Host header to upstream server.
      proxy_set_header Host $host;
      # 6: Set the PS-CapabilityList header for PageSpeed server to respect.
      proxy_set_header PS-CapabilityList $ps_capability_list;
      add_header PS-CapabilityList $ps_capability_list;
      # 7: Add a header for identifying cache hits/misses/expires. This is
      # for debugging purposes only and can be commented out in production.
      add_header X-Cache $upstream_cache_status;

      # Block 5b: Override Cache-Control headers as needed.
      # Hide the upstream cache control header.
      proxy_hide_header Cache-Control;
      # Add the inferred Cache-Control header.
      add_header Cache-Control $new_cache_control_header_val;

      proxy_set_header PS-ShouldBeacon $should_beacon_header_val;
      proxy_hide_header PS-ShouldBeacon;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name if-in-server.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    set $inline_javascript "No";

    if ($http_x_custom_header_inline_js) {
      # TODO(jefftk): Turn on NGX_HTTP_SIF_CONF and figure out how to get
      # pagespeed directives inside of a server location block to be respected,
      # then uncomment the following line and duplicate the if-in-location test
      # for if-in-server.
      #pagespeed EnableFilters inline_javascript;
      set $inline_javascript "Yes";
    }

    add_header "X-Inline-Javascript" $inline_javascript;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name if-in-location.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";


    location / {
      set $inline_javascript "No";
      pagespeed RewriteLevel PassThrough;

      if ($http_x_custom_header_inline_js) {
        pagespeed EnableFilters inline_javascript;
        set $inline_javascript "Yes";
      }

      add_header "X-Inline-Javascript" $inline_javascript;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name secondary.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";

    pagespeed MapProxyDomain secondary.example.com/gstatic_images
                             http://www.gstatic.com/psa/static;
  }

  # These three vhosts are for testing the experiment framework (Furious).
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name experiment.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed InPlaceResourceOptimization off;

    pagespeed RunExperiment on;
    pagespeed AnalyticsID "123-45-6734";
    pagespeed UseAnalyticsJs false;
    pagespeed ExperimentVariable 2;
    pagespeed ExperimentSpec
      "id=7;enable=recompress_images;disable=convert_jpeg_to_progressive;percent=50";
    pagespeed ExperimentSpec "id=2;enable=recompress_images;percent=50";
    pagespeed ExperimentSpec "id=3;default;percent=0";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name contentexperiment.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed InPlaceResourceOptimization off;

    pagespeed RunExperiment on;
    pagespeed AnalyticsID "123-45-6734";
    pagespeed UseAnalyticsJs false;
    pagespeed ExperimentVariable 2;
    pagespeed ExperimentSpec
      "id=7;enable=recompress_images;disable=convert_jpeg_to_progressive;percent=50;options=ContentExperimentID=ID:H1BpS2TCRFmJzZgjwyeBHQ,ContentExperimentVariantID=111";
    pagespeed ExperimentSpec
      "id=2;enable=recompress_images;percent=50;options=ContentExperimentID=ID:H1BpS2TCRFmJzZgjwyeBHQ,ContentExperimentVariantID=222";
    pagespeed ExperimentSpec
      "id=3;default;percent=0;options=ContentExperimentID=123,ContentExperimentVariantID=333";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name experiment.noga.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RunExperiment on;
    pagespeed ExperimentVariable 2;
    pagespeed ExperimentSpec
      "id=7;enable=recompress_images;disable=convert_jpeg_to_progressive;percent=50";
    pagespeed ExperimentSpec "id=2;enable=recompress_images;percent=50";
    pagespeed ExperimentSpec "id=3;default;percent=0";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name experiment.devicematch.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RunExperiment on;
    pagespeed ExperimentSpec
      "id=1;percent=100;matches_device_type=mobile;enable=recompress_images";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name experiment.ajax.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel CoreFilters;
    pagespeed DisableFilters add_instrumentation;
    pagespeed JsInlineMaxBytes 1;
    pagespeed RunExperiment on;
    pagespeed UseAnalyticsJs false;
    pagespeed ExperimentSpec "id=1;percent=100;level=CoreFilters;enable=collapse_whitespace;options=JsInlineMaxBytes=1";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name ajax.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel CoreFilters;
    pagespeed EnableFilters add_instrumentation;
    pagespeed JsInlineMaxBytes 1;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name preserveurls.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed EnableFilters inline_preview_images,lazyload_images;
    pagespeed EnableFilters resize_mobile_images,rewrite_images,sprite_images;
    pagespeed EnableFilters fallback_rewrite_css_urls,flatten_css_imports;
    pagespeed EnableFilters inline_css,move_css_above_scripts,move_css_to_head;
    pagespeed EnableFilters outline_css,rewrite_css,combine_css;
    pagespeed EnableFilters combine_javascript,defer_javascript;
    pagespeed EnableFilters inline_javascript;
    pagespeed EnableFilters outline_javascript,rewrite_javascript;

    location /mod_pagespeed_test/preserveurls/on/ {
       pagespeed JsPreserveURLs On;
       pagespeed ImagePreserveURLs On;
       pagespeed CssPreserveURLs On;
    }

    location /mod_pagespeed_test/preserveurls/off/ {
       pagespeed JsPreserveURLs Off;
       pagespeed ImagePreserveURLs Off;
       pagespeed CssPreserveURLs Off;
    }
  }

  server {
    # Setup a vhost with the critical image beacon and lazyload filter enabled
    # to make sure that critical images are not lazyloaded.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name imagebeacon.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters lazyload_images;
    pagespeed CriticalImagesBeaconEnabled true;
  }

  server {
    # Setup a vhost with the critical image beacon enabled to make sure that
    # downstream caches and rebeaconing interact correctly.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name downstreamcacherebeacon.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed CriticalImagesBeaconEnabled true;
    # Enable the downstream caching feature and specify a rebeaconing key.
    pagespeed DownstreamCachePurgeLocationPrefix "http://localhost:@@SECONDARY_PORT@@/purge";
    pagespeed DownstreamCacheRebeaconingKey random_rebeaconing_key;
    location ~ .*[.]html {
      add_header Cache-Control "private, max-age=3000";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name downstreamcacheresource.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;
    pagespeed DownstreamCachePurgeLocationPrefix "http://localhost:@@SECONDARY_PORT@@/purge";
  }

  # Set up a reverse proxy (rproxy.) and origin (origin.) as vhosts for
  # showing that we can configure PageSpeed via response headers.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name rproxy.rmcomments.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed DisableFilters add_instrumentation,remove_comments;

    # Note that we don't enable remove_comments here; that setting comes from
    # the response headers from origin.rmcomments.example.com
    location / {
      proxy_pass http://127.0.0.1:@@SECONDARY_PORT@@/;
      proxy_set_header "Host" "origin.rmcomments.example.com";
    }
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name origin.rmcomments.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed off;
    location / {
      add_header PageSpeedFilters remove_comments;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name renderedimagebeacon.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters resize_rendered_image_dimensions;
    pagespeed CriticalImagesBeaconEnabled true;
  }


  # Build a configuration hierarchy where at the root we have turned on
  # OptimizeForBandwidth, and in various subdirectories we override settings
  # to make them more aggressive.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name optimizeforbandwidth.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RewriteLevel OptimizeForBandwidth;
    pagespeed DisableFilters add_instrumentation;

    location /mod_pagespeed_test/optimize_for_bandwidth/inline_css {
      pagespeed EnableFilters inline_css;
    }
    location /mod_pagespeed_test/optimize_for_bandwidth/css_urls {
      pagespeed CssPreserveURLs off;
    }
    location /mod_pagespeed_test/optimize_for_bandwidth/image_urls {
      pagespeed ImagePreserveURLs off;
    }
    location /mod_pagespeed_test/optimize_for_bandwidth/core_filters {
      pagespeed RewriteLevel CoreFilters;
    }
  }

  server {
    # For testing with a custom origin header.  In this VirtualHost,
    # /mod_pagespeed_test is included in our DocumentRoot and thus does
    # not need to be in any resource URL paths.  This helps us verify that
    # we are looping back to the corect VirtualHost -- if we hit the wrong
    # one it will not work.  Also we don't have a VirtualHost for
    # sharedcdn.example.com, so the default Host header used for
    # origin-mapping won't work either.  Instead, we want origin-fetches
    # to go back to this VirtualHost so we rely on the new third optional
    # argument to MapOriginDomain.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name customhostheader.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@_test";
    root "@@SERVER_ROOT@@/mod_pagespeed_test";

    pagespeed on;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;
    # Don't use localhost, as ngx_pagespeed's native fetcher cannot resolve it
    pagespeed MapOriginDomain 127.0.0.1:@@SECONDARY_PORT@@/customhostheader
              sharedcdn.example.com/test customhostheader.example.com;
    pagespeed JpegRecompressionQuality 50;
    pagespeed CriticalImagesBeaconEnabled false;
  }

  server {
    # Sets up a virtual host where we can specify forbidden filters without
    # affecting any other hosts.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name forbidden.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";


    # Start with all core filters enabled ...
    pagespeed RewriteLevel CoreFilters;
    # ... then forbid these filters ...
    pagespeed ForbidFilters remove_quotes,remove_comments,collapse_whitespace;
    pagespeed ForbidFilters rewrite_css,resize_images;
    # ... and disable but not forbid this one (to ensure we retain its URL).
    pagespeed DisableFilters inline_css;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name unauthorizedresources.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed InlineResourcesWithoutExplicitAuthorization Script,Stylesheet;
    pagespeed CssInlineMaxBytes 1000000;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name client-domain-rewrite.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    # Don't actually try to rewrite any resources; the ones in
    # rewrite_domains.html don't actually exist.
    pagespeed RewriteLevel PassThrough;

    pagespeed MapRewriteDomain http://client-domain-rewrite.example.com
              http://src.example.com;
    pagespeed ClientDomainRewrite true;
    pagespeed EnableFilters rewrite_domains;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name url-attribute.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    # Don't actually try to rewrite any resources; the ones in
    # rewrite_domains.html don't actually exist.
    pagespeed RewriteLevel PassThrough;

    # This is used for testing dynamically defined url-valued
    # attributes
    pagespeed UrlValuedAttribute span src Hyperlink;
    pagespeed UrlValuedAttribute hr imgsrc Image;
    pagespeed DomainRewriteHyperlinks on;
    pagespeed MapRewriteDomain http://dst.example.com http://src.example.com;
    pagespeed EnableFilters rewrite_domains;
    pagespeed UrlValuedAttribute custom a Image;
    pagespeed UrlValuedAttribute custom b otherResource;
    pagespeed UrlValuedAttribute custom c hyperlink;
    pagespeed UrlValuedAttribute img alt-src Image;
    pagespeed UrlValuedAttribute video alt-a Image;
    pagespeed UrlValuedAttribute video alt-b Image;
    pagespeed UrlValuedAttribute link data-stylesheet Stylesheet;
    pagespeed UrlValuedAttribute span data-stylesheet-a Stylesheet;
    pagespeed UrlValuedAttribute span data-stylesheet-b Stylesheet;
    pagespeed UrlValuedAttribute span data-stylesheet-c Stylesheet;

    # Also test that we can redefine spec-defined attributes.
    pagespeed UrlValuedAttribute blockquote cite Image;
  }

  server {
    listen 127.0.0.2:@@SECONDARY_PORT@@;
    server_name loopbackfetch.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name domain-hyperlinks-on.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    # Don't actually try to rewrite any resources; the ones in
    # rewrite_domains.html don't actually exist.
    pagespeed RewriteLevel PassThrough;

    pagespeed DomainRewriteHyperlinks on;
    pagespeed MapRewriteDomain http://dst.example.com http://src.example.com;
    pagespeed EnableFilters rewrite_domains;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name domain-hyperlinks-off.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    # Don't actually try to rewrite any resources; the ones in
    # rewrite_domains.html don't actually exist.
    pagespeed RewriteLevel PassThrough;

    pagespeed DomainRewriteHyperlinks off;
    pagespeed MapRewriteDomain http://dst.example.com http://src.example.com;
    pagespeed EnableFilters rewrite_domains;
  }

  server {
    # Test host for shared memory cache.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name shmcache.example.com;
    pagespeed FileCachePath "@@SHM_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name xfp.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RespectXForwardedProto on;

    location /redirecting_origin {
      pagespeed off;
      # Hack: we clear the response headers using headers_more.
      # If we don't, nginx will add an extra empty Location: headers here.
      # It is kind of hard to get nginx to generate a relative location header
      # that starts with "/".
      more_clear_headers 'Location';
      add_header Location /mod_pagespeed_example;
      return 301;
    }
    location /redirect {
      proxy_method GET;
      proxy_pass http://127.0.0.1:@@SECONDARY_PORT@@/redirecting_origin;
      proxy_set_header "Host" "xfp.example.com";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name xheader.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed XHeaderValue "UNSPECIFIED VERSION";
  }

  # Support for embedded configurations, where image flags in the
  # VirtualHost serving HTML is not the same as the one serving resources,
  # and thus we must embed the image flags in the rewritten image URLs.
  #
  # Note that we test with two distinct caches.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name embed-config-html.example.org;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    root "@@SERVER_ROOT@@/mod_pagespeed_test";

    pagespeed AddOptionsToUrls on;
    pagespeed JpegRecompressionQuality 73;
    pagespeed DisableFilters inline_css,extend_cache,inline_javascript;
    pagespeed Domain embed-config-resources.example.com;

    # Share a cache keyspace with embed-config-resources.example.com.
    pagespeed CacheFragment "embed-config";

    pagespeed LoadFromFile "http://embed-config-resources.example.com/"
      "@@SERVER_ROOT@@/mod_pagespeed_example/";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name embed-config-resources.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    root "@@SERVER_ROOT@@/mod_pagespeed_example";

    pagespeed AddOptionsToUrls on;

    # Note that we do not set the jpeg quality here, but take
    # it from image URL query parameters that we synthesize in
    # from embed-config-html.example.org.

    # Share a cache keyspace with embed-config-html.example.org.
    pagespeed CacheFragment "embed-config";

    pagespeed LoadFromFile "http://embed-config-resources.example.com/"
      "@@SERVER_ROOT@@/mod_pagespeed_example/";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name ipro-for-browser.example.com;
    root "@@SERVER_ROOT@@/mod_pagespeed_example";
    pagespeed EnableFilters rewrite_images,rewrite_css;
    pagespeed EnableFilters convert_to_webp_lossless;
    pagespeed EnableFilters in_place_optimize_for_browser;
    pagespeed JpegRecompressionQuality 75;
    pagespeed WebpRecompressionQuality 70;
    pagespeed InPlaceResourceOptimization on;
    pagespeed AllowVaryOn "Accept";
    pagespeed FileCachePath "@@IPRO_CACHE@@";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name ipro-for-browser-vary-on-auto.example.com;
    root "@@SERVER_ROOT@@/mod_pagespeed_example";
    pagespeed EnableFilters rewrite_images,rewrite_css;
    pagespeed EnableFilters convert_to_webp_animated;
    pagespeed EnableFilters convert_to_webp_lossless;
    pagespeed EnableFilters in_place_optimize_for_browser;
    pagespeed InPlaceResourceOptimization on;
    # pagespeed AllowVaryOn "Accept";  # Default is "Auto".
    pagespeed ImageRecompressionQuality 90;
    pagespeed JpegRecompressionQuality 75;
    pagespeed JpegRecompressionQualityForSmallScreens 55;
    pagespeed JpegQualityForSaveData 35;
    pagespeed WebpRecompressionQuality 70;
    pagespeed WebpRecompressionQualityForSmallScreens 50;
    pagespeed WebpQualityForSaveData 30;
    pagespeed WebpAnimatedRecompressionQuality 60;
    pagespeed FileCachePath "@@IPRO_CACHE@@";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name ipro-for-browser-vary-on-none.example.com;
    root "@@SERVER_ROOT@@/mod_pagespeed_example";
    pagespeed EnableFilters rewrite_images,in_place_optimize_for_browser;
    pagespeed InPlaceResourceOptimization on;
    pagespeed AllowVaryOn "None";
    pagespeed ImageRecompressionQuality 75;
    pagespeed FileCachePath "@@IPRO_CACHE@@";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name respectvary.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RespectVary on;
    add_header Vary User-Agent;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cache_a.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed CacheFlushPollIntervalSec 1;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters inline_css;

    # Make a non-empty subdirectory config to make sure that
    # cache.flush updates get transmitted to nested configurations.
    #
    # TODO(jmarantz): This test currently fails on ngx_pagespeed, meaning we
    # don't handle cache flushing correctly here.  Uncomment the config below to
    # expose the error.
    #location /mod_pagespeed_test/cache_flush/ {
    #  pagespeed RewriteLevel PassThrough;
    #  pagespeed EnableFilters inline_css;
    #  pagespeed DisableFilters add_instrumentation;
    #}
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cache_b.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";

    pagespeed CacheFlushPollIntervalSec 1;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters inline_css;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cache_c.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed CacheFlushFilename "othercache.flush";
    pagespeed CacheFlushPollIntervalSec 1;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters inline_css;
  }

  # The next three server blocks are for a cdn test.
  server {
    # Sets up a logical home-page server on www.example.com
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name www.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed LoadFromFile http://cdn.example.com @@SERVER_ROOT@@/;
    pagespeed MapRewriteDomain cdn.example.com origin.example.com;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_css,rewrite_images;
    pagespeed CacheFragment "example";
  }
  server {
    # Sets up a logical origin for CDNs to fetch content from, on
    # origin.example.com.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name origin.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed LoadFromFile http://cdn.example.com @@SERVER_ROOT@@/;
    pagespeed MapRewriteDomain cdn.example.com origin.example.com;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_css,rewrite_images;
    pagespeed CacheFragment "example";
  }
  server {
    # Sets up a logical cdn, which is where we tell browsers to fetch resources
    # from.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cdn.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed LoadFromFile http://cdn.example.com @@SERVER_ROOT@@/;
    pagespeed MapRewriteDomain cdn.example.com origin.example.com;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_css,rewrite_images;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name lff-ipro.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed LoadFromFile
      "http://lff-ipro.example.com/mod_pagespeed_example/lff_ipro"
      "@@SERVER_ROOT@@/mod_pagespeed_example/lff_ipro";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name tryfiles.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { }
    location ~ "^/ngx_pagespeed_static/" { }
    location ~ "^/ngx_pagespeed_beacon$" { }

    try_files $uri $uri/ /mod_pagespeed_example/index.html;
  }

  server {
    # Proxy modpagespeed.com for testing Issue 582.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name modpagespeed.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed off;

    location / {
      proxy_pass http://modpagespeed.com;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name custom-paths.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed StatisticsPath /custom_pagespeed_statistics;
    pagespeed ConsolePath /custom_pagespeed_console;
    pagespeed MessagesPath /custom_pagespeed_message;
    pagespeed AdminPath /custom_pagespeed_admin;

    pagespeed StatisticsDomains Allow *;
    pagespeed GlobalStatisticsDomains Allow *;
    pagespeed MessagesDomains Allow *;
    pagespeed ConsoleDomains Allow *;
    pagespeed AdminDomains Allow *;
    pagespeed GlobalAdminDomains Allow *;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name inherit-paths.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed StatisticsDomains Allow *;
    pagespeed GlobalStatisticsDomains Allow *;
    pagespeed MessagesDomains Allow *;
    pagespeed ConsoleDomains Allow *;
    pagespeed AdminDomains Allow *;
    pagespeed GlobalAdminDomains Allow *;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name blocking.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name keepalive-html.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel CoreFilters;
    error_log "@@TEST_TMP@@/keepalive-html.example.com.error.log" warn;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name keepalive-resource.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    error_log "@@TEST_TMP@@/keepalive-resource.example.com.error.log" warn;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name keepalive-beacon-get.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    error_log "@@TEST_TMP@@/keepalive-beacon-get.example.com.error.log" warn;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name keepalive-beacon-post.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    error_log "@@TEST_TMP@@/keepalive-beacon-post.example.com.error.log" warn;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name keepalive-static.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    error_log "@@TEST_TMP@@/keepalive-static.example.com.error.log" warn;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name response-header-filters.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed on;
    location / {
      proxy_pass http://localhost:@@SECONDARY_PORT@@;
      proxy_set_header Host "enable-filter-header-origin.example.com";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name response-header-disable.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed EnableFilters add_instrumentation;
    pagespeed on;
    location / {
      proxy_pass http://localhost:@@SECONDARY_PORT@@;
      proxy_set_header Host "pagespeed-off-header-origin.example.com";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name headers.example.com;
    pagespeed InPlaceRewriteDeadlineMs -1;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed LoadFromFile "http://headers.example.com/"
              "@@SERVER_ROOT@@/";
    location /mod_pagespeed_test/ {
      more_set_headers "Server: override";
      more_set_headers -s '404' 'Cache-Control: override';
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name custom404.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    error_page 404 /404.html;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name ipro.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";

    pagespeed on;
    pagespeed InPlaceResourceOptimization on;

    location /mod_pagespeed_test/ipro/nocache/test_image_dont_reuse.png {
      add_header Cache-Control no-cache;
    }

    location /mod_pagespeed_test/ipro/no-cache-control-header {
      add_header Cache-Control "";
      pagespeed ImplicitCacheTtlMs 333000;
    }
  }

  # Test hosts to cover all possible cache configurations.  L1 will be filecache
  # or memcache depending on the setting of MEMCACHED_TEST.  These four hosts
  # are for the four settings for the L2 cache.

  # 1. L2_d=LRU, L2_m=LRU
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name lrud-lrum.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_lrud_lrum";

    pagespeed LRUCacheKbPerProcess 1024;
    pagespeed LRUCacheByteLimit 2000;
    pagespeed EnableFilters rewrite_images;
    pagespeed CriticalImagesBeaconEnabled false;
  }

  # 2. L2_d=LRU, L2_m=SHM
  pagespeed CreateSharedMemoryMetadataCache
            "@@SECONDARY_CACHE@@_lrud_shmm" 8192;
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name lrud-shmm.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_lrud_shmm";

    pagespeed LRUCacheKbPerProcess 1024;
    pagespeed LRUCacheByteLimit 2000;
    pagespeed EnableFilters rewrite_images;
    pagespeed CriticalImagesBeaconEnabled false;
  }

  # 3. L2_d=none, L2_m=SHM
  pagespeed CreateSharedMemoryMetadataCache
            "@@SECONDARY_CACHE@@_noned_shmm" 8192;
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name noned-shmm.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_noned_shmm";

    pagespeed EnableFilters rewrite_images;
    pagespeed CriticalImagesBeaconEnabled false;
  }

  # 4. L2_d=none, L2_m=none
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name noned-nonem.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_noned_nonem";

    pagespeed EnableFilters rewrite_images;
    pagespeed CriticalImagesBeaconEnabled false;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name date.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    add_header "Date" "Fri, 16 Oct 2009 23:05:07 GMT";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name options-by-cookies-enabled.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_optionsbycookieson";
    pagespeed AllowOptionsToBeSetByCookies true;
    pagespeed StickyQueryParameters sticky_secret;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters collapse_whitespace;
    pagespeed DisableFilters remove_comments,add_instrumentation;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name options-by-cookies-disabled.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_optionsbycookiesoff";
    pagespeed AllowOptionsToBeSetByCookies false;
    pagespeed DisableFilters add_instrumentation;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name redirect.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_redirected";
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters add_instrumentation,collapse_whitespace;
    location /redirect {
      rewrite ^/redirect/(.*) http://$server_name/$1 permanent;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name request-option-override.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RequestOptionOverride abc;
    pagespeed RewriteLevel Passthrough;
    pagespeed EnableFilters collapse_whitespace;
    pagespeed DisableFilters remove_comments,add_instrumentation;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name signed-urls.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed UrlSigningKey helloworld;
    pagespeed RewriteLevel Passthrough;
    pagespeed EnableFilters collapse_whitespace,rewrite_images;
    pagespeed DisableFilters remove_comments,add_instrumentation;
  }

  # For testing signed URLs, ignoring signature validity.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name signed-urls-transition.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed UrlSigningKey helloworld;
    pagespeed AcceptInvalidSignatures true;
    pagespeed RewriteLevel Passthrough;
    pagespeed EnableFilters collapse_whitespace,rewrite_images;
    pagespeed DisableFilters remove_comments,add_instrumentation;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name unsigned-urls-transition.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    # This server will not sign URLs, but AcceptInvalidSignature is on.
    pagespeed AcceptInvalidSignatures true;
    pagespeed RewriteLevel Passthrough;
    pagespeed EnableFilters collapse_whitespace,rewrite_images;
    pagespeed DisableFilters remove_comments,add_instrumentation;
  }

  # Start remote config servers.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/standard";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-partially-invalid.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl
              "http://127.0.0.1:@@RCPORT@@/partly-invalid";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-invalid.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/invalid";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-failed-fetch.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/fail-future";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-slow-fetch.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/timeout";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-experiment.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/experiment";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-slightly-slow-fetch.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl
              "http://127.0.0.1:@@RCPORT@@/slightly-slow";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-slightly-slow-expired-fetch.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/slow-expired";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-forbidden.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/forbidden";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-initially-forbidden.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl
              "http://127.0.0.1:@@RCPORT@@/forbidden-once";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }

  # Test that pagespeed is disabled when sendfile headers are present.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name uses-sendfile.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed EnableFilters inline_javascript,rewrite_javascript;
    add_header 'X-Sendfile' 'blablabla';
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name doesnt-sendfile.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed EnableFilters inline_javascript,rewrite_javascript;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name uses-xaccelredirect.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed EnableFilters inline_javascript,rewrite_javascript;
    add_header 'X-Accel-Redirect' 'blablabla';
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name map-static-domain.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed MapRewriteDomain http://static-cdn.example.com
                               http://map-static-domain.example.com;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters defer_javascript,rewrite_domains;
  }

  # Proxy + IPRO a gzip'd file for testing Issue 896.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name ipro-proxy.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@_ipro_proxy";

    pagespeed on;
    pagespeed InPlaceResourceOptimization on;
    pagespeed EnableFilters rewrite_domains;

    location / {
      proxy_pass
       "http://localhost:@@PRIMARY_PORT@@/mod_pagespeed_test/ipro/mod_deflate/";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name compressedcache.example.com;
    pagespeed on;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed EnableFilters rewrite_css;
    pagespeed HttpCacheCompressionLevel 9;
    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      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_pass 127.0.0.1:9000;
      fastcgi_buffering off;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name uncompressedcache.example.com;
    pagespeed on;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed EnableFilters rewrite_css;
    pagespeed HttpCacheCompressionLevel 0;
    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      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_pass 127.0.0.1:9000;
      fastcgi_buffering off;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name compressed-css.example.com;
    pagespeed on;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed InPlaceResourceOptimization on;
  }

  # nested gzip config: pagespeed gzip on/off
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name gzip-test1.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    location /mod_pagespeed_example/ {
      pagespeed gzip off;
    }
    location /mod_pagespeed_example/styles/ {
      pagespeed gzip on;
    }
  }

  # nested gzip config: pagespeed on/off
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name gzip-test2.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    location /mod_pagespeed_example/ {
      pagespeed off;
    }
    location /mod_pagespeed_example/styles/ {
      pagespeed on;
    }
  }

  server {
    pagespeed on;
    pagespeed EnableFilters add_instrumentation;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name proxy-post.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    location / {
      # Transform the POST to a GET request for the origin,
      # as nginx's static handler doesn't allow POST requests.
      proxy_method GET;
      proxy_pass http://127.0.0.1:@@SECONDARY_PORT@@/;
      proxy_set_header "Host" "proxy-post-origin.example.com";
    }
  }

  server {
    pagespeed off;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name proxy-post-origin.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    root "@@SERVER_ROOT@@/";
  }

  server {
    # Write all post data to temp files
    client_body_in_file_only clean;
    pagespeed CriticalImagesBeaconEnabled true;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name beacon-post-temp-file.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name script-filters.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    root "@@SERVER_ROOT@@/";
    set $filters "";
    set $domain_shards "cdn1.example.com,cdn2.example.com";
    if ($http_X_Script) {
        set $filters "add_instrumentation";
        set $domain_shards "";
    }
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_domains;
    pagespeed EnableFilters $filters;
    pagespeed ShardDomain script-filters.example.com "$domain_shards";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name purge.example.com;

    # Test purging individual URLs without flushing the entire metadata cache.
    pagespeed EnableCachePurge on;

    pagespeed PurgeMethod PURGE;
    root "@@SERVER_ROOT@@/purge";
    pagespeed FileCachePath "@@FILE_CACHE@@_purge";
    pagespeed DisableFilters add_instrumentation;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_css;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name psoff-dir-on.example.com;

    # Test purging individual URLs without flushing the entire metadata cache.
    pagespeed EnableCachePurge on;

    pagespeed PurgeMethod PURGE;
    root "@@SERVER_ROOT@@/purge";
    pagespeed FileCachePath "@@FILE_CACHE@@_dir_on";
    pagespeed DisableFilters add_instrumentation;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_css;
    pagespeed off;
    location / {
      pagespeed on;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name  cc-header-origin.example.com;
    pagespeed InPlaceResourceOptimization off;
    pagespeed off;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    root "@@SERVER_ROOT@@/";
    location /mod_pagespeed_test/nostore {
      add_header "Cache-Control" "max-age=12345";
      add_header "Cache-Control" "public, no-store";
      add_header "Cache-Control" "max-age=14";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name  enable-filter-header-origin.example.com;
    pagespeed InPlaceResourceOptimization off;
    pagespeed off;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    root "@@SERVER_ROOT@@/";
    location / {
      add_header "PageSpeedFilters" "add_instrumentation";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name  pagespeed-off-header-origin.example.com;
    pagespeed InPlaceResourceOptimization off;
    pagespeed off;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    root "@@SERVER_ROOT@@/";
    location / {
      add_header "PageSpeed" "off";
    }
  }

  pagespeed MessagesDomains Allow messages-allowed.example.com;
  pagespeed MessagesDomains Allow cleared-inherited.example.com;
  pagespeed MessagesDomains Allow cleared-inherited-reallowed.example.com;
  pagespeed MessagesDomains Allow more-messages-allowed.example.com;
  pagespeed MessagesDomains Allow anything-*-wildcard.example.com;
  pagespeed MessagesDomains Allow localhost;

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name messages-allowed.example.com
                messages-not-allowed.example.com
                more-messages-allowed.example.com
                anything-a-wildcard.example.com
                anything-b-wildcard.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name messages-still-not-allowed.example.com
                but-this-message-allowed.example.com
                and-this-one.example.com;
    pagespeed MessagesDomains Allow but-this-message-allowed.example.com;
    pagespeed MessagesDomains Allow and-this-one.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cleared-inherited.example.com
                cleared-inherited-reallowed.example.com
                messages-allowed-at-vhost.example.com
                messages-not-allowed-at-vhost.example.com
                anything-c-wildcard.example.com;
    pagespeed MessagesDomains Disallow *;
    pagespeed MessagesDomains Allow cleared-inherited-reallowed.example.com;
    pagespeed MessagesDomains Allow messages-allowed-at-vhost.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cleared-inherited-unlisted.example.com;
    pagespeed MessagesDomains Allow *;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    server_name nothing-allowed.example.com;
    pagespeed MessagesDomains Disallow *;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    server_name nothing-explicitly-allowed.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name everything-explicitly-allowed.example.com
                everything-explicitly-allowed-but-aliased.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed StatisticsDomains Allow everything-explicitly-allowed.example.com;
    pagespeed GlobalStatisticsDomains
      Allow everything-explicitly-allowed.example.com;
    pagespeed MessagesDomains Allow everything-explicitly-allowed.example.com;
    pagespeed ConsoleDomains Allow everything-explicitly-allowed.example.com;
    pagespeed AdminDomains Allow everything-explicitly-allowed.example.com;
    pagespeed GlobalAdminDomains
     Allow everything-explicitly-allowed.example.com;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name psol-vary.example.com;
    pagespeed on;
    pagespeed InPlaceResourceOptimization on;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name flush.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed RewriteDeadlinePerFlushMs 1;

    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      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_pass 127.0.0.1:9000;
      fastcgi_buffering off;
    }
  }
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name noflush.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed RewriteDeadlinePerFlushMs 1;
    pagespeed FollowFlushes off;

    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      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_pass 127.0.0.1:9000;
      fastcgi_buffering off;
    }
  }
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name special-response.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    error_page 404 /mod_pagespeed_test/php_withflush.php;
    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      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_pass 127.0.0.1:9000;
    }
  }
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name debug-filters.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters debug;
  }
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name broken-fetch.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@/broken-fetch";

    # Set up a fetch proxy that will 404 every request.
    pagespeed FetchProxy "brokenfetch.example.com:1111";

    # Prevent loopback fetch by explicitly authorizing the domain.  Loopback
    # fetches would work, and for this test, we're trying to have fetches fail,
    # so they are instead picked up by the ipro recorder.
    pagespeed Domain http://broken-fetch.example.com;
    pagespeed InPlaceResourceOptimization on;

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_javascript;
    pagespeed DisableFilters add_instrumentation;
    pagespeed CriticalImagesBeaconEnabled false;
  }
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name image-rewrite-with-flush.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed UrlValuedAttribute li data-thumb image;
    pagespeed EnableFilters core;
    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      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_pass 127.0.0.1:9000;
      fastcgi_buffering off;
    }
  }
  server {
    listen @@PRIMARY_PORT@@;
    listen [::]:@@PRIMARY_PORT@@;
    server_name  localhost;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    location ~ ^/pagespeed_admin {
      allow 127.0.0.1;
      allow ::1;
      deny all;
    }

    location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
      # TODO(oschaaf): The following breaks nginx starting up, as the bad header
      # value gets rejected during configuration parsing. However, we can't easily
      # build a test for that right now.
      # pagespeed AddResourceHeader "X-Fo\n\no" "Bar";
      # pagespeed AddResourceHeader "X-Foo" "Ba\nr";

      # For testing that AddResourceHeader gets passed through
      pagespeed AddResourceHeader "X-Foo" "Bar";
      add_header "" "";
    }

    # Backend for ipro-proxy.example.com
    location /mod_pagespeed_test/ipro/mod_deflate/ {
      pagespeed off;
    }

    location /mod_pagespeed_test/cachable_rewritten_html/ {
      # This location has the html files that will be configured to be stored
      # in the proxy_cache layer.
      pagespeed DownstreamCachePurgeMethod "GET";
      pagespeed DownstreamCachePurgeLocationPrefix "http://localhost:@@SECONDARY_PORT@@/purge";
      pagespeed DownstreamCacheRebeaconingKey "random_rebeaconing_key";
      # We use a very small deadline here to force the rewriting to not complete
      # in the very first attempt.
      pagespeed RewriteDeadlinePerFlushMs 1;
      pagespeed RewriteLevel PassThrough;
      pagespeed EnableFilters collapse_whitespace,extend_cache,recompress_images;
      pagespeed CriticalImagesBeaconEnabled true;
      add_header Cache-Control "public, max-age=100";
    }

    location /mod_pagespeed_test/disable_no_transform/index.html {
      pagespeed DisableRewriteOnNoTransform off;
    }

    location /mod_pagespeed_test/disable_no_transform/disable_no_transform.css {
      add_header 'Cache-Control' 'no-transform';
    }

    location /mod_pagespeed_test/no_transform {
      add_header 'Cache-Control' 'no-transform';
    }

    # uncomment the following two lines if you're testing memcached
    #pagespeed MemcachedServers "localhost:11211";
    #pagespeed MemcachedThreads 1;

    pagespeed on;

    #pagespeed CacheFlushPollIntervalSec 1;

    #pagespeed RunExperiment on;
    #pagespeed AnalyticsID "UA-XXXXXXXX-Y";
    #pagespeed ExperimentSpec "id=1;percent=50;default";
    #pagespeed ExperimentSpec "id=2;percent=50";

    pagespeed Library 43 1o978_K0_LNE5_ystNklf
      http://www.modpagespeed.com/rewrite_javascript.js;
    pagespeed RetainComment " google_ad_section*";
    pagespeed PermitIdsForCssCombining "allowed-to-combine-1-*";
    pagespeed PermitIdsForCssCombining "allowed-to-combine-2-*";

    # Test proxying of non-.pagespeed. resources.
    pagespeed MapProxyDomain http://localhost:@@PRIMARY_PORT@@/modpagespeed_http
                           http://@@PAGESPEED_TEST_HOST@@/do_not_modify;
    pagespeed MapProxyDomain http://localhost:@@PRIMARY_PORT@@/content_type_present
                           http://@@PAGESPEED_TEST_HOST@@:8091;
    pagespeed MapProxyDomain http://localhost:@@PRIMARY_PORT@@/content_type_absent
                           http://@@PAGESPEED_TEST_HOST@@:8092;

    add_header X-Extra-Header 1;

    # Establish a proxy mapping where the current server proxies an image
    # stored on ref.pssdemos.com.
    pagespeed MapProxyDomain localhost:@@PRIMARY_PORT@@/gstatic_images
                             http://www.gstatic.com/psa/static;

    location /ngx_pagespeed_statistics {
      allow 127.0.0.1;
      allow ::1;
      deny all;
    }

    location /ngx_pagespeed_message {
      allow 127.0.0.1;
      allow ::1;
      deny all;
    }

    pagespeed Domain modpagespeed.com:1023;
    # As opposed to mod_pagespeed, our default for aris is 'on'
    pagespeed AvoidRenamingIntrospectiveJavascript off;

    location /mod_pagespeed_test/nostore {
      proxy_pass http://localhost:@@SECONDARY_PORT@@;
      proxy_set_header Host "cc-header-origin.example.com";
    }

    location /mod_pagespeed_test/forbid_all_disabled/disabled {
      # Prevent the enabling of these filters for files in this directory
      # -and- all subdirectories.
      #
      # Apache checks here that they can't be renabled with .htaccess, but
      # that's not how Nginx location blocks work.
      pagespeed ForbidAllDisabledFilters true;
      pagespeed DisableFilters remove_quotes,remove_comments;
      pagespeed DisableFilters collapse_whitespace;
    }

    location /mod_pagespeed_test/max_html_parse_size {
      pagespeed MaxHtmlParseBytes 5000;
    }

    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      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_pass 127.0.0.1:9000;
    }

    location /mod_pagespeed_example/core_filters/ {
      pagespeed RewriteLevel CoreFilters;
    }

    location /mod_pagespeed_example/pass_through/ {
      pagespeed RewriteLevel PassThrough;
    }

    #location / {
    #  proxy_pass http://www.google.com;
    #}

    location /mod_pagespeed_test/ssi/ {
      ssi on;

      pagespeed EnableFilters collapse_whitespace,remove_comments,combine_css;
      pagespeed DisableFilters add_instrumentation;
      pagespeed DisableFilters inline_css;
    }

    location /mod_pagespeed_test/no_cache/ {
      add_header Cache-Control no-cache;
    }

    location /mod_pagespeed_test/compressed/ {
      add_header Content-Encoding gzip;

      # Even though this is also in the server block it must be repeated here
      # because add_header directives are only inherited if you don't define
      # more of them.  See: http://serverfault.com/questions/400197
      add_header X-Extra-Header 1;

      types {
        text/javascript custom_ext;
      }
    }

    location /mod_pagespeed_test/shard/ {
      pagespeed ShardDomain "localhost:@@PRIMARY_PORT@@" shard1,shard2;
      pagespeed RewriteLevel PassThrough;
      pagespeed EnableFilters extend_cache;
    }

    location /mod_pagespeed_test/retain_cache_control/ {
      pagespeed ModifyCachingHeaders off;
      add_header Cache-Control "private, max-age=3000";
    }

    location /mod_pagespeed_test/retain_cache_control_with_downstream_caching/ {
      pagespeed ModifyCachingHeaders on;
      pagespeed DownstreamCachePurgeLocationPrefix "http://localhost:8020/";
      add_header Cache-Control "private, max-age=3000";
    }

    location /mod_pagespeed_test/avoid_renaming_introspective_javascript__on/ {
      pagespeed AvoidRenamingIntrospectiveJavascript on;
    }

    location /mod_pagespeed_test/custom_options/ {
      pagespeed DisableFilters convert_jpeg_to_progressive;
    }

    location /mod_pagespeed_test/ipro/test_image_dont_reuse.png {
      expires 5m;
    }

    location /mod_pagespeed_test/example.json {
      expires 10m;
    }

    location /mod_pagespeed_test/ipro/cc200/ {
      add_header "Cache-Control" "max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200p/ {
      add_header "Cache-Control" "private, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200nc/ {
      add_header "Cache-Control" "no-cache, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200ns/ {
      add_header "Cache-Control" "no-store, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200nt/ {
      add_header "Cache-Control" "no-transform, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200sma5/ {
      add_header "Cache-Control" "s-maxage=5, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200sma50/ {
      add_header "Cache-Control" "s-maxage=50, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200sma50nsp/ {
      add_header "Cache-Control" "s-maxage=50,max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc9/ {
      add_header "Cache-Control" "max-age=9";
    }
    location /mod_pagespeed_test/ipro/cc200cc9/ {
      add_header "Cache-Control" "max-age=200, max-age=9";
    }
    location /mod_pagespeed_test/ipro/cc200sma50sma5/ {
      add_header "Cache-Control" "max-age=200, s-maxage=50, s-maxage=5";
    }
    location /mod_pagespeed_test/ipro/cc200sma50cc9/ {
      add_header "Cache-Control" "max-age=200, s-maxage=50, max-age=9";
    }
    location /mod_pagespeed_test/ipro/cc200sma50cc9nsp/ {
      add_header "Cache-Control" "max-age=200,s-maxage=50,max-age=9";
    }
    location /mod_pagespeed_test/ipro/cc200sma50sma51/ {
      add_header "Cache-Control" "max-age=200, s-maxage=50, s-maxage=51";
    }

    location /mod_pagespeed_test/ipro/wait/ {
      # TODO(jmarantz): ModPagespeedInPlaceWaitForOptimized should be superfluous,
      # or made equivalent to ModPagespeedInPlaceRewriteDeadlineMs -1, which waits
      # forever.  Otherwise ModPagespeedInPlaceRewriteDeadlineMs should just have
      # the specified deadline.
      # # See https://github.com/pagespeed/mod_pagespeed/issues/1171 for more
      # detailed discussion.
      pagespeed InPlaceWaitForOptimized on;
    }

    location /mod_pagespeed_test/ipro/wait/long/ {
      # Make the deadline long here for valgrind tests.  We could
      # conditionalize this.
      pagespeed InPlaceRewriteDeadlineMs 10000;
    }

    location /mod_pagespeed_test/ipro/wait/short/ {
      pagespeed EnableFilters in_place_optimize_for_browser;

      # Make the deadline short here as we expect to always miss it
      # in tests.
      pagespeed InPlaceRewriteDeadlineMs 1;
    }

    location /mod_pagespeed_test/ipro/instant/wait/ {
      pagespeed InPlaceWaitForOptimized on;

      # TODO(jefftk): When running with valgrind we need to raise the rewrite
      # deadline or else we get "Deadline exceeded for rewrite of resource".
      # I had thought InPlaceWaitForOptimized was supposed to disable the
      # rewrite deadline, but it seems not to.
      #
      # InPlaceWaitForOptimized is definitely doing something, though: when I
      # remove the InPlaceRewriteDeadlineMs line below and run without valgrind,
      # purple.css is optimized via ipro on the first request but if I set
      # InPlaceWaitForOptimized to off then it is not.
      pagespeed InPlaceRewriteDeadlineMs 1000;
    }

    location /mod_pagespeed_test/ipro/instant/deadline/ {
      set $ps_deadline -1;
      pagespeed ImageRecompressionQuality $ps_deadline;
      pagespeed InPlaceRewriteDeadlineMs $ps_deadline;
    }

    # Test to make sure that user-authenticated resources do not get cached and
    # optimized.
    location /mod_pagespeed_test/auth/ {
       auth_basic "Restricted";
       auth_basic_user_file "@@SERVER_ROOT@@/mod_pagespeed_test/auth/passwd.conf";
    }

    location /mod_pagespeed_test/ipro/cookie/ {
      # Add Vary:Cookie.  This should prevent us from optimizing the
      # vary_cookie.css even though PagespeedRespectVary is off.
      # test/nginx_system_test.sh does the fetches test with and w/o cookies.
      add_header Vary Cookie;
      pagespeed RespectVary off;
      pagespeed InPlaceWaitForOptimized on;
    }

    location /mod_pagespeed_test/ipro/cookie2/ {
      # Add Vary:Cookie2.  This should prevent us from optimizing the
      # vary_cookie2.css even though PagespeedRespectVary is off.
      # test/nginx_system_test.sh does the fetches test with and w/o cookie2.
      add_header Vary Cookie2;
      pagespeed RespectVary off;
      pagespeed InPlaceWaitForOptimized on;
    }

    location /mod_pagespeed_test/vary/ {
      pagespeed RespectVary on;
    }

    location ~ /mod_pagespeed_test/vary/\.(js|css)$ {
        add_header Vary User-Agent;
    }

    location /mod_pagespeed_test/vary/no_respect/ {
      pagespeed DisableFilters add_instrumentation,inline_css;
      pagespeed RespectVary off;
    }

    location /mod_pagespeed_test/experimental_js_minifier/ {
      pagespeed UseExperimentalJsMinifier on;
    }

    pagespeed FetchHttps enable;
    location /mod_pagespeed_test/https_fetch/ {
      pagespeed DisableFilters inline_images;
      set $ps_gstatic "https://www.gstatic.com/psa/static";
      pagespeed MapProxyDomain
          http://localhost:@@PRIMARY_PORT@@/https_gstatic_dot_com
          $ps_gstatic;
    }

    location /mod_pagespeed_test/strip_subresource_hints/default/ {
      pagespeed DisableFilters add_instrumentation;
      pagespeed RewriteLevel CoreFilters;
      pagespeed DisAllow *dontrewriteme*;
    }
    location /mod_pagespeed_test/strip_subresource_hints/default_passthrough/ {
      pagespeed DisableFilters add_instrumentation;
      pagespeed RewriteLevel PassThrough;
    }
    location /mod_pagespeed_test/strip_subresource_hints/preserve_on/ {
      pagespeed DisableFilters add_instrumentation;
      pagespeed PreserveSubresourceHints on;
      pagespeed RewriteLevel CoreFilters;
    }
    location /mod_pagespeed_test/strip_subresource_hints/preserve_off/ {
      pagespeed DisableFilters add_instrumentation;
      pagespeed PreserveSubresourceHints off;
      pagespeed RewriteLevel CoreFilters;
    }
    # $host implicitly tests script variable support. I'd love to test it more
    # directly, but so far this is the best I've come up with and duplicating
    # the test doesn't seem to make sense.
    pagespeed LoadFromFile
        "http://$host:@@PRIMARY_PORT@@/mod_pagespeed_test/ipro/instant/"
        "@@SERVER_ROOT@@/mod_pagespeed_test/ipro/instant/";

    location /mod_pagespeed_test/public/ {
      add_header "Cache-Control" "public, max-age=600";
      pagespeed PreserveUrlRelativity off;
    }

    pagespeed EnableFilters remove_comments;

    # Test LoadFromFile mapping by mapping one dir to another.
    pagespeed LoadFromFile
      "http://localhost:@@PRIMARY_PORT@@/mod_pagespeed_test/load_from_file/web_dir/"
      "@@SERVER_ROOT@@/mod_pagespeed_test/load_from_file/file_dir/";
    pagespeed LoadFromFileMatch
      "^http://localhost:@@PRIMARY_PORT@@/mod_pagespeed_test/load_from_file_match/web_([^/]*)/"
      "@@SERVER_ROOT@@/mod_pagespeed_test/load_from_file/file_\1/";
    pagespeed LoadFromFileRule Disallow
      "@@SERVER_ROOT@@/mod_pagespeed_test/load_from_file/file_dir/httponly/";
    pagespeed LoadFromFileRuleMatch Disallow \.ssp.css$ps_dollar;
    pagespeed LoadFromFileRuleMatch Allow exception\.ssp\.css$ps_dollar;
    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    index index.html;


    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
      root   html;
    }
  }

  sendfile        on;

  keepalive_timeout  65;

  types {
    text/html                             html htm shtml;
    text/css                              css;
    text/xml                              xml;
    image/gif                             gif;
    image/jpeg                            jpeg jpg;
    application/x-javascript              js;
    application/atom+xml                  atom;
    application/rss+xml                   rss;

    text/mathml                           mml;
    text/plain                            txt;
    text/vnd.sun.j2me.app-descriptor      jad;
    text/vnd.wap.wml                      wml;
    text/x-component                      htc;

    image/png                             png;
    image/tiff                            tif tiff;
    image/vnd.wap.wbmp                    wbmp;
    image/x-icon                          ico;
    image/x-jng                           jng;
    image/x-ms-bmp                        bmp;
    image/svg+xml                         svg svgz;
    image/webp                            webp;

    application/json                      json;
    application/java-archive              jar war ear;
    application/mac-binhex40              hqx;
    application/msword                    doc;
    application/pdf                       pdf;
    application/postscript                ps eps ai;
    application/rtf                       rtf;
    application/vnd.ms-excel              xls;
    application/vnd.ms-powerpoint         ppt;
    application/vnd.wap.wmlc              wmlc;
    application/vnd.google-earth.kml+xml  kml;
    application/vnd.google-earth.kmz      kmz;
    application/x-7z-compressed           7z;
    application/x-cocoa                   cco;
    application/x-java-archive-diff       jardiff;
    application/x-java-jnlp-file          jnlp;
    application/x-makeself                run;
    application/x-perl                    pl pm;
    application/x-pilot                   prc pdb;
    application/x-rar-compressed          rar;
    application/x-redhat-package-manager  rpm;
    application/x-sea                     sea;
    application/x-shockwave-flash         swf;
    application/x-stuffit                 sit;
    application/x-tcl                     tcl tk;
    application/x-x509-ca-cert            der pem crt;
    application/x-xpinstall               xpi;
    application/xhtml+xml                 xhtml;
    application/zip                       zip;

    application/octet-stream              bin exe dll;
    application/octet-stream              deb;
    application/octet-stream              dmg;
    application/octet-stream              eot;
    application/octet-stream              iso img;
    application/octet-stream              msi msp msm;

    audio/midi                            mid midi kar;
    audio/mpeg                            mp3;
    audio/ogg                             ogg;
    audio/x-m4a                           m4a;
    audio/x-realaudio                     ra;

    video/3gpp                            3gpp 3gp;
    video/mp4                             mp4;
    video/mpeg                            mpeg mpg;
    video/quicktime                       mov;
    video/webm                            webm;
    video/x-flv                           flv;
    video/x-m4v                           m4v;
    video/x-mng                           mng;
    video/x-ms-asf                        asx asf;
    video/x-ms-wmv                        wmv;
    video/x-msvideo                       avi;
  }
  default_type  application/octet-stream;

}
