Fro*_*kys 6 subdomain mod-rewrite nginx url-rewriting
我目前在我的nginx.conf中有以下(hacky)重写规则,允许动态子域重定向到一个Django实例.
set $subdomain "";
set $subdomain_root "";
set $doit "";
if ($host ~* "^(.+)\.domain\.com$") {
set $subdomain $1;
set $subdomain_root "/profile/$subdomain";
set $doit TR;
}
if (!-f $request_filename) {
set $doit "${doit}UE";
}
if ($doit = TRUE) {
rewrite ^(.*)$ $subdomain_root$1;
break;
}
Run Code Online (Sandbox Code Playgroud)
我确信有一种更有效的方法可以做到这一点,但我需要更改此规则,以便任何请求*.domain.com/media/*或*.domain.com/downloads/*转到domain.com/media/*和domain.com/downloads/*.
您可以使用正则表达式服务器名称(请参阅http://nginx.org/en/docs/http/server_names.html#regex_names)并将匹配的组直接分配给变量$ subdomain:
server {
listen 80;
listen 443;
server_name ~^(?<subdomain>.+)\.domain\.com$
location / {
rewrite ^ /profile/$subdomain$request_uri;
}
}
Run Code Online (Sandbox Code Playgroud)
实际上我认为更改nginx重写规则比为django编写中间件要容易得多.在了解了nginx如何处理它的位置匹配(最精确 - >最不精确)后,我为/ media和/ download创建了位置以及为/ I捕获所有位置然后将重写规则移到/位置下并简化了它 - 因为我不再担心检查文件,因为整个位置传递给django - 规则变为:
set $subdomain "";
set $subdomain_root "";
if ($host ~* "^(.+)\.domain\.com$") {
set $subdomain $1;
set $subdomain_root "/profile/$subdomain";
rewrite ^(.*)$ $subdomain_root$1;
break;
}
Run Code Online (Sandbox Code Playgroud)
如果我的nginx\regex脚本更好:)可能会更简单:)
| 归档时间: |
|
| 查看次数: |
7847 次 |
| 最近记录: |