0

I have a static HTML site with a 404 page at /404/index.html. Vagrant is mapping port 80 to 9000 so I access my site at http://localhost:9000. The site is browsable, but if I try to force a 404 error I'm seeing /index.html instead. I've tried following a bunch of tutorials, but it always ends up showing the index page.

If I do vagrant ssh I have the same experience. The only difference is that I can do curl http://localhost/404/ and see the 404 page's content. Ansible is expanding the values of the {{ }} template items during provisioning.

default (site template)

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root {{ web_root }};
    index index.html index.htm;

    # Make site accessible from `http://localhost/`
    server_name localhost;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ /index.html;
        # Uncomment to enable naxsi on this location
        # include /etc/nginx/naxsi.rules
    }

    location /doc/ {
        alias /usr/share/doc/;
        autoindex on;
        allow 127.0.0.1;
        allow ::1;
        deny all;
    }

    # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
    #location /RequestDenied {
    #   proxy_pass http://127.0.0.1:8080;
    #}

    error_page 400 404 /404/index.html;
    location = /404/index.html {
        root {{ web_root }};
    }



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

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #   fastcgi_split_path_info ^(.+\.php)(/.+)$;
    #   # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    #
    #   # With php5-cgi alone:
    #   fastcgi_pass 127.0.0.1:9000;
    #   # With php5-fpm:
    #   fastcgi_pass unix:/var/run/php5-fpm.sock;
    #   fastcgi_index index.php;
    #   include fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #   deny all;
    #}
}

nginx.conf

user www-data;
worker_processes {{ ansible_processor_count }};

pid /var/run/nginx.pid;

events {
    worker_connections {{ connections }} ;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # If HTTPS, then set a variable so it can be passed along.
    ##

    map $scheme $server_https {
        default off;
        https on;
    }

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
3

To be honest, I haven't messed around with different 404 pages, but having try_files $uri $uri/ /index.html; and getting index.html is what I would expect.

Try changing to try_files $uri $uri/ /404/index.html;

1
  • Thanks that was it. This seems like a neat config feature, but it makes me wonder whether it is too smart ;) – Brian Lyttle Aug 19 '13 at 4:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.