我希望我的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"
但不包含任何其他网址。
答案 0 :(得分:6)
如果你可以自己生成HTML文件,你可以简单地使用nginx的重写模块。例如:
rewrite ^/book book-name-eq-$arg_name-published_at-eq-$arg_published_at.html last;
如果您需要确保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;
}
这将确保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)。有一些提示:
使用'try_files'而不是'rewrite'
在静态文件名中使用' - '而不是下划线'_',否则在将$ arg_parameters设置为文件名时,nginx会感到困惑。例如使用“platform- $ arg_platform.json”而不是“platform_ $ arg_platform.json”
这是我的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