Question

I want my Nginx serve dynamical urls as static pages, e.g.

given a url  "/book?name=ruby_lang&published_at=2014" , 
the nginx will serve a static file (which is generated automatically ) named as:
"book?name=ruby_lang&published_at=2014.html"  or:
"book-name-eq-ruby_lang-pblished_at-eq-2014.html"

is this possible?

NOTE:

1.there's no static file named:

  "book?name=ruby_lang&published_at=2014.html" nor 
  "book-name-eq-ruby_lang-pblished_at-eq-2014.html"

however, I can generate them if needed.

2.I can't change the url that give to the consumer. e.g. my consumer could only send request to me via

  "/book?name=ruby_lang&published_at=2014"

but not with any other urls.

Was it helpful?

Solution

If you are OK with generating the HTML files yourself, you could simply use nginx's rewrite module. Example:

rewrite ^/book book-name-eq-$arg_name-published_at-eq-$arg_published_at.html last;

If you need to make sure that name and published_at are valid, you can instead do something like this:

location = /book {
    if ($arg_name !~ "^[A-Za-z\d_-]+$") { return 404; }
    if ($arg_published_at !~ "^\d{4}$") { return 404; }
    rewrite ^/book book-name-eq-$arg_name-published_at-eq-$arg_published_at.html last;
}

This will make sure that published_at is a valid 4-digits integer, and name is a valid identifier (English alphabets, numbers, underscore, and hyphen).


To make sure a book is only accessible from one URL, you should throw 404 if the URL is the HTML file. Add this before the previous rule:

location ~ /book-(.*).html {
    return 404;
}

OTHER TIPS

OK, thanks to @Alon Gubkin's help, finally I solved this problem, (see : http://siwei.me/blog/posts/nginx-try-files-and-rewrite-tips) .here are some tips:

  1. use 'try_files' instead of 'rewrite'

  2. use '-' instead of underscore '_' in your static file names, otherwise nginx would get confused when setting $arg_parameters to your file name. e.g. use "platform-$arg_platform.json' instead of "platform_$arg_platform.json"

  3. take a look at nginx built-in variables.

and this is my nginx config snippet:

server {
  listen       100;
  charset utf-8;
  root /workspace/test_static_files;
  index index.html index.htm;

  # nginx will first search '/platform-$arg_platform...' file, 
  # if not found return /defautl.json 
  location /popup_pages {
    try_files /platform-$arg_platform-product-$arg_product.json /default.json;
  } 
}

also I put my code on github so that someone interested in this issue could take a look: https://github.com/sg552/server_dynamic_urls_as_static_files

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top