![이 두 nginx 규칙이 제대로 작동하도록 어떻게 병합합니까?](https://rvso.com/image/717767/%EC%9D%B4%20%EB%91%90%20nginx%20%EA%B7%9C%EC%B9%99%EC%9D%B4%20%EC%A0%9C%EB%8C%80%EB%A1%9C%20%EC%9E%91%EB%8F%99%ED%95%98%EB%8F%84%EB%A1%9D%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EB%B3%91%ED%95%A9%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
htaccess 규칙을 사용하기 전에 Apache를 실행하고 있었지만 Discourse 포럼 소프트웨어의 docker 인스턴스를 실행하는 nginx로 전환했습니다. Docker 인스턴스 외부에서 nginx를 실행한 다음 domain.com/forum에 위치하도록 Proxypass를 사용하고 있습니다. www를 뺀 입력 하위 도메인을 취하기 위해 아래와 같이 설정하기 전에는 다음과 같이 설정했습니다. URL 끝에 추가하세요. 하위 도메인이 제공되지 않으면 정상적으로 작동하게 됩니다.
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteCond %{HTTP_HOST} .example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/forum/t/%1$1 [L,NC,QSA]
나는 htaccess에서 nginx로의 변환기를 사용하여 다음을 제공했습니다.
location / {
if ($http_host !~ "^www\."){
rewrite ^(.*)$ http://example.com/forum/t/%1$1 redirect;
}
}
내 현재 위치 설정은 다음과 같습니다.
location /forum {
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
fastcgi_read_timeout 60;
}
그래서 제 질문은 if 문의 변환된 코드를 Proxy_pass 항목이 포함된 현재 코드와 어떻게 병합할 수 있느냐는 것입니다. 그냥 거기에 넣으려고 했는데 결국 루프로 끝났습니다.
어떤 통찰력이라도 감사하겠습니다. 감사합니다!
답변1
이것이 내가 성공한 결과입니다. 특정 하위 도메인에 대한 사실 뒤에 몇 가지 추가 항목을 추가했지만 이것이 실제로 작동하게 된 것입니다.
server {
server_name example.com www.example.com;
listen ipaddress;
root /home/me/public_html;
index index.html index.htm index.php;
access_log /var/log/virtualmin/example.com_access_log;
error_log /var/log/virtualmin/example.com_error_log;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME /home/me/public_html$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT /home/me/public_html;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS $https;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/php-nginx/15187383894597.sock/socket;
}
listen 443 ssl http2; listen [::]:443 ssl http2;
ssl_certificate /home/me/ssl.combined;
ssl_certificate_key /home/me/ssl.key;
http2_idle_timeout 5m; # up from 3m default
location /forum {
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
fastcgi_read_timeout 60;
}
# This server forwards requests from subdomains
server {
server_name ~^(.*)\.example\.com$;
listen ipaddress default_server;
location / {
return 301 https://example.com/forum/c/$1;
}
}
그런 다음 임의의 특정 항목을 테스트하기 위해 이들 중 몇 가지를 추가했는데 제대로 작동했습니다.
# Test for specificsub
server {
server_name specificsub.example.com;
listen ipaddress;
location / {
return 301 https://example.com/forum/c/assets/specificsub;
}
}
# Test for specificsub2
server {
server_name specificsub2.example.com;
listen ipaddress;
location / {
return 301 https://example.com/forum/c/assets/specificsub2;
}
}
답변2
이와 같은 것이 작업을 수행해야 합니다. 이것은 아마도 그대로 작동하지는 않을 것이지만, 자신을 발전시키기 위한 일반적인 전략을 제공할 것입니다. 누군가가 이 모든 작업을 수행하고 테스트해 주기를 원한다면 컨설턴트를 고용해야 합니다.
나는 당신이 무제한의 하위 도메인 세트를 가지고 있다고 가정합니다.
// This server serves only forum traffic on the main domain
server {
server_name example.com;
location /forum {
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
proxy_set_header Host $http_host;
// etc
}
// This should forward all requests to the forum subfolder
location / {
return 301 http://example.com/forum/;
}
// Insert any other required locations
}
// This server forwards requests from subdomains
server {
server_name ~^(.*)\.example\.com$;
// If the line above doesn't work uncomment these two and try them instead. They basically listen to everything not specified explicitly.
// listen 80 default_server;
// server_name _;
location / {
return 301 http://example.com/forum/t/$1;
}
}