![Как объединить эти два правила nginx, чтобы все работало правильно?](https://rvso.com/image/717767/%D0%9A%D0%B0%D0%BA%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C%20%D1%8D%D1%82%D0%B8%20%D0%B4%D0%B2%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0%20nginx%2C%20%D1%87%D1%82%D0%BE%D0%B1%D1%8B%20%D0%B2%D1%81%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%BB%D0%BE%20%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%3F.png)
Я использовал Apache до использования правила htaccess, но переключился на nginx, запускающий экземпляр docker программного обеспечения форума Discourse. Я запускаю nginx вне экземпляра docker, а затем использую proxypass, чтобы он находился в domain.com/forum. До этого я настраивал его, как показано ниже, чтобы брать любой введенный поддомен за вычетом 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;
}
}