nginx 动态 server_name 带变量
nginx dynamic server_name with variable
亲爱的 Whosebug 社区,我正在与不支持动态 GET 请求(例如 example.com?variable=somethingDynamic)的第三方合作,因此我不得不使用自定义子域,但我不想让每个动态请求的子域所以我一直在想:
如何编写 server_name 来捕获两个或三个动态变量?
这是我的示例服务器块:
server {
listen 80;
server_name someSecretUrl_$variable1_$variable2.example.com;
root /usr/share/campagins/campagin1;
client_max_body_size 10000m;
proxy_connect_timeout 30000;
location /funnel_webhooks/test {
return 200;
}
location / {
if ($request_method = 'OPTIONS') {
# Tell client that this pre-flight info is valid for 20 days
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
add_header 'Access-Control-Allow-Origin' "$http_origin" always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Etag,Last-Modified,HTTP_IF_MODIFIED_SINCE,HTTP_IF_NONE_MATCH' always;
return 204;
}
add_header 'Access-Control-Allow-Origin' "$http_origin" always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Etag,Last-Modified,HTTP_IF_MODIFIED_SINCE,HTTP_IF_NONE_MATCH,ETag,Retry-After' always;
add_header 'Access-Control-Expose-Headers' 'ETag,Retry-After' always;
add_header 'Cache-Control' "must-revalidate, post-check=0, pre-check=0" always;
rewrite ^(.*)$ ?preMadeDataParsers=$variable1&preMadeDataParsersOnResponse=$variable2&$args break;
proxy_buffering off;
proxy_pass http://localhost:3000; #proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE_ADDR $remote_addr;
}
}
看看上面的代码,您会注意到我正在尝试将 $variable1 移动到一个 GET 变量中,并将 $variable2 移动到另一个 get 变量中,我该如何实现呢?
谢谢!
我不会在 nginx 中这样做,我会在您的应用程序中这样做。 (特别是如果您希望扩展此资源。)
我会将服务器配置为侦听根本没有虚拟主机的 IP,以便它响应对该 IP 发出的任何请求。只需省略 server_name
指令:
server {
listen 1.2.3.4:80;
...
然后使用通配符条目配置您的 DNS,以便 *.example.com 指向该 IP。现在您可以点击 any_string.example.com
,它将解析为您的 IP,得到主服务器块的响应,并传递给您的应用程序。
然后,在您的应用中,查看请求的主机名。 (例如,在 PHP 中,这可以通过 $_SERVER['HTTP_HOST']
获得。)如果您的应用确定请求的主机名无效,只需发出 404 并退出。否则,解码主机名并处理请求。
这样,您可以在不编辑 nginx 配置的情况下添加新变量和新功能。您甚至可以在 JSON 中对变量进行编码,然后使用 BASE64 对它们进行编码:
$vars = [
'var1' => 'one',
'var2' => 'two',
'var3' => 'three',
];
$url = base64_encode(json_encode($vars));
eyJ2YXIxIjoib25lIiwidmFyMiI6InR3byIsInZhcjMiOiJ0aHJlZSJ9.example.com
现在您可以传递任意数量、任意名称的变量,包括索引数组和关联数组。 (不过请注意,域名长度有限制,您必须对 +
和 /
字符做一些处理,我很确定这些字符在域名中无效。)
亲爱的 Whosebug 社区,我正在与不支持动态 GET 请求(例如 example.com?variable=somethingDynamic)的第三方合作,因此我不得不使用自定义子域,但我不想让每个动态请求的子域所以我一直在想:
如何编写 server_name 来捕获两个或三个动态变量?
这是我的示例服务器块:
server {
listen 80;
server_name someSecretUrl_$variable1_$variable2.example.com;
root /usr/share/campagins/campagin1;
client_max_body_size 10000m;
proxy_connect_timeout 30000;
location /funnel_webhooks/test {
return 200;
}
location / {
if ($request_method = 'OPTIONS') {
# Tell client that this pre-flight info is valid for 20 days
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
add_header 'Access-Control-Allow-Origin' "$http_origin" always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Etag,Last-Modified,HTTP_IF_MODIFIED_SINCE,HTTP_IF_NONE_MATCH' always;
return 204;
}
add_header 'Access-Control-Allow-Origin' "$http_origin" always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Etag,Last-Modified,HTTP_IF_MODIFIED_SINCE,HTTP_IF_NONE_MATCH,ETag,Retry-After' always;
add_header 'Access-Control-Expose-Headers' 'ETag,Retry-After' always;
add_header 'Cache-Control' "must-revalidate, post-check=0, pre-check=0" always;
rewrite ^(.*)$ ?preMadeDataParsers=$variable1&preMadeDataParsersOnResponse=$variable2&$args break;
proxy_buffering off;
proxy_pass http://localhost:3000; #proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE_ADDR $remote_addr;
}
}
看看上面的代码,您会注意到我正在尝试将 $variable1 移动到一个 GET 变量中,并将 $variable2 移动到另一个 get 变量中,我该如何实现呢? 谢谢!
我不会在 nginx 中这样做,我会在您的应用程序中这样做。 (特别是如果您希望扩展此资源。)
我会将服务器配置为侦听根本没有虚拟主机的 IP,以便它响应对该 IP 发出的任何请求。只需省略 server_name
指令:
server {
listen 1.2.3.4:80;
...
然后使用通配符条目配置您的 DNS,以便 *.example.com 指向该 IP。现在您可以点击 any_string.example.com
,它将解析为您的 IP,得到主服务器块的响应,并传递给您的应用程序。
然后,在您的应用中,查看请求的主机名。 (例如,在 PHP 中,这可以通过 $_SERVER['HTTP_HOST']
获得。)如果您的应用确定请求的主机名无效,只需发出 404 并退出。否则,解码主机名并处理请求。
这样,您可以在不编辑 nginx 配置的情况下添加新变量和新功能。您甚至可以在 JSON 中对变量进行编码,然后使用 BASE64 对它们进行编码:
$vars = [
'var1' => 'one',
'var2' => 'two',
'var3' => 'three',
];
$url = base64_encode(json_encode($vars));
eyJ2YXIxIjoib25lIiwidmFyMiI6InR3byIsInZhcjMiOiJ0aHJlZSJ9.example.com
现在您可以传递任意数量、任意名称的变量,包括索引数组和关联数组。 (不过请注意,域名长度有限制,您必须对 +
和 /
字符做一些处理,我很确定这些字符在域名中无效。)