如何使用nginx处理动态URL作为静态页面?

时间:2014-02-26 05:39:33

标签: mod-rewrite nginx content-management-system static-pages

我希望我的Nginx将动态网址作为静态网页,例如

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"
这可能吗?

注意:

1.没有名为的静态文件:

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

然而,如果需要,我可以生成它们。

2.我无法更改提供给消费者的网址。例如我的消费者只能通过

向我发送请求
  "/book?name=ruby_lang&published_at=2014"

但不包含任何其他网址。

2 个答案:

答案 0 :(得分:6)

如果你可以自己生成HTML文件,你可以简单地使用nginx的重写模块。例如:

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

如果您需要确保namepublished_at有效,则可以执行以下操作:

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

这将确保published_at是有效的4位整数,name是有效的标识符(英文字母,数字,下划线和连字符)。


要确保只能从一个网址访问图书,如果网址是HTML文件,则应该抛出404。在之前的规则之前添加

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

答案 1 :(得分:1)

好的,感谢@Alon Gubkin的帮助,最后我解决了这个问题,(参见:http://siwei.me/blog/posts/nginx-try-files-and-rewrite-tips)。有一些提示:

  1. 使用'try_files'而不是'rewrite'

  2. 在静态文件名中使用' - '而不是下划线'_',否则在将$ arg_parameters设置为文件名时,nginx会感到困惑。例如使用“platform- $ arg_platform.json”而不是“platform_ $ arg_platform.json”

  3. 查看nginx built-in variables

  4. 这是我的nginx配置代码段:

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

    我也把我的代码放在github上,以便对这个问题感兴趣的人可以看看: https://github.com/sg552/server_dynamic_urls_as_static_files