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

Siw*_*申思维 1 mod-rewrite nginx static-pages content-management-system

我希望我的Nginx服务动态URL作为静态页面,例如

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"
Run Code Online (Sandbox Code Playgroud)

这可能吗?

注意:

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

  "book?name=ruby_lang&published_at=2014.html" nor 
  "book-name-eq-ruby_lang-pblished_at-eq-2014.html"
Run Code Online (Sandbox Code Playgroud)

但是,如果需要,我可以生成它们.

2.我不能改变给消费者的网址.例如,我的消费者只能通过我发送请求

  "/book?name=ruby_lang&published_at=2014"
Run Code Online (Sandbox Code Playgroud)

但没有任何其他网址.

Alo*_*kin 6

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

rewrite ^/book book-name-eq-$arg_name-published_at-eq-$arg_published_at.html last;
Run Code Online (Sandbox Code Playgroud)

如果您需要确保name并且published_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;
}
Run Code Online (Sandbox Code Playgroud)

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


要确保只能从一个URL访问一本书,如果URL是HTML文件,则应该抛出404.在上一条规则之前添加:

location ~ /book-(.*).html {
    return 404;
}
Run Code Online (Sandbox Code Playgroud)