# 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 {
    # 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/";
  }

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

}
