微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

url-rewriting – 使用Flask Nginx基于动态URL提供静态文件?

在Flask中,如果将文件放在名为static /的目录中,则任何形式为http://localhost/static/foo.jpg的URL都将从static / foo.jpg提供该文件.

这也可以通过Nginx配置来完成:

    location /static {
        alias    /var/www/mywebsite/static;
    }

但是,我想做动态URL重写.

如果有人请求URL http://localhost/username/foo.jpg,我想告诉Nginx从任意URL获取静态文件,比如/var/www/assets/11235/1bcd5.jpg.我希望用户看到一个漂亮的网址,我希望该位置对用户透明.

是否有捷径可寻?理想情况下,我可以做一些事情,以便Nginx提供文件.但是,如果Flask需要服务它,那也很好(它不像我的项目还有任何用户!)

在这里错过了什么?

解决方法:

如果文件可以使用“漂亮”URL中直接引用的名称进行存储,那么您可以在Nginx中进行简单的重写.

但是,您似乎希望将URL路径信息映射到磁盘上的其他表示,如用户名 – > 11235和foo.jpg – > 1bcd5.jpg.如果正在提供的内容应该通过身份验证或会话进行保护,那么您应该在Flask应用程序中保留映射和重写,因为Flask提供了执行此操作的方法.

如果内容可以被视为公共内容并且只需要完成映射,则可以将Nginx配置为获取查询字符串参数,在数据存储区中查找它们,然后重写URL.

这是一个最初发布在Nginx邮件列表上的example from agentzh

考虑一下你的意思是/ baz,真正的uri是/ foo / bar.我有
我的本地MysqL“test”数据库中的下表:

create table my_url_map(id serial, url text, SEO_url);
insert into my_url_map(url, SEO_url)values('/foo/bar', '/baz');

我用这种方式构建我的Nginx 0.8.41:

./configure \
--add-module=/path/to/ngx_devel_kit \
--add-module=/path/to/set-misc-Nginx-module \
--add-module=/path/to/ngx_http_auth_request_module-0.2 \
--add-module=/path/to/echo-Nginx-module \
--add-module=/path/to/lua-Nginx-module \
--add-module=/path/to/drizzle-Nginx-module \
--add-module=/path/to/rds-json-Nginx-module

另外,我有lua 5.1.4和lua-yajl库安装到我的系统.

这是我的Nginx.conf的核心部分:

upstream backend {
    drizzle_server 127.0.0.1:3306 dbname=test
    password=some_pass user=monty protocol=MysqL;
    drizzle_keepalive max=300 mode=single overflow=ignore;
}

lua_package_cpath '/path/to/your/lua/yajl/library/?.so';

server {
    ...

    location /conv-MysqL {
        internal;
        set_quote_sql_str $SEO_uri $query_string; # to prevent sql injection
        drizzle_query "select url from my_url_map where SEO_url=$SEO_uri";
        drizzle_pass backend;
        rds_json on;
    }

    location /conv-uid {
        internal;
        content_by_lua_file 'html/foo.lua';
    }

    location /jump {
        internal;
        rewrite ^ $query_string? redirect;
    }

    # your SEO uri
    location /baz {
        set $my_uri $uri;
        auth_request /conv-uid;

        echo_exec /jump $my_uri;
    }
}

foo.lua的内容,必不可少的胶水:

local yajl = require('yajl')
local SEO_uri = ngx.var.my_uri
local res = ngx.location.capture('/conv-MysqL?' .. SEO_uri)
if (res.status ~= ngx.HTTP_OK) then
ngx.throw_error(res.status)
end
res = yajl.to_value(res.body)
if (not res or not res[1] or not res[1].url) then
ngx.throw_error(ngx.HTTP_INTERNAL_SERVER_ERROR)
end
ngx.var.my_uri = res[1].url;

然后让我们从客户端访问/ baz:

$curl -i localhost:1984/baz
HTTP/1.1 302 Moved Temporarily
Server: Nginx/0.8.41 (without pool)
Date: Tue, 24 Aug 2010 03:28:42 GMT
Content-Type: text/html
Content-Length: 176
Location: http://localhost:1984/foo/bar
Connection: keep-alive

<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>Nginx/0.8.41 (without pool)</center>
</body>
</html>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐