我有两个需要服务的网站:一个静态网站和一个动态网站(Rails 应用程序,实际上并不重要)。我正在考虑以下事项:
请求 domain.com/ => 静态网站
请求 domain.com/anything => 动态网站
Nginx 的位置指令似乎非常适合这种情况:
server {
listen 80;
server_name www.domain.com *.domain.com;
# Static match. Any exact match enters here
location = / {
root /link/to/static/folder;
index index.html;
}
# Dynamic match
location / {
root /link/to/dynamic/folder;
proxy_pass unix_socket_defined_above;
}
}
但每当我向 domain.com 发出请求时,它都会被定向到动态匹配。我遗漏了什么?
编辑:虽然它不是最佳的,但我通过以下声明实现了所需的功能:
server {
listen 80;
server_name domain.com .domain.com;
# Static match. Any exact match enters here
location = / {
root /link/to/static/folder;
index index.html;
}
# Dynamic match, make sure the URL has
# characters after the server name
location ~ ^/..* {
root /link/to/dynamic/folder;
proxy_pass unix_socket_defined_above;
}
}
但我确信有一个“正确的方法”来实现这一点。
答案1
您的server_name
指令不匹配domain.com
。
该*.domain.com
形式与 重复www.domain.com
,并且 不匹配domain.com
。请server_name .domain.com
改用 。
因此,如果您有一个明确的默认服务器块或一个处理在此之前包含的其他域的请求的服务器块,那么您的请求将在其中处理。
现在,如果不是这种情况,那么它确实会处理domain.com/
并domain.com/anything
请求,隐式地成为您的默认服务器块。在这种情况下,该index.html
文件由第二个位置块提供服务,因为该index
指令将发出内部重定向。
所以你需要改变这个:
location = / {
root /link/to/static/folder;
index index.html;
}
对此:
location ~ /(?:index.html)?$ {
root /link/to/static/folder;
index index.html;
}