Wie füge ich diese beiden Nginx-Regeln zusammen, damit es ordnungsgemäß funktioniert?

Wie füge ich diese beiden Nginx-Regeln zusammen, damit es ordnungsgemäß funktioniert?

Ich habe Apache ausgeführt, bevor ich eine htaccess-Regel verwendet habe, bin dann aber zu nginx gewechselt, das eine Docker-Instanz der Discourse-Forum-Software ausführt. Ich führe nginx außerhalb der Docker-Instanz aus und verwende dann proxypass, sodass es sich in domain.com/forum befindet. Zuvor hatte ich es wie unten gezeigt eingerichtet, um jede eingegebene Subdomäne abzüglich www. zu nehmen und an das Ende der URL anzuhängen. Wenn keine Subdomäne angegeben wird, funktioniert es einfach wie gewohnt.

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteCond %{HTTP_HOST} .example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/forum/t/%1$1 [L,NC,QSA]

Ich habe einen Konverter von htaccess zu nginx verwendet, der mir Folgendes gab:

location / {
  if ($http_host !~ "^www\."){
   rewrite ^(.*)$ http://example.com/forum/t/%1$1 redirect;
  }
}

Meine aktuelle Standortkonfiguration sieht folgendermaßen aus:

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;
 }

Meine Frage ist also, wie ich meinen konvertierten Code in der if-Anweisung mit meinem aktuellen Code zusammenführen kann, der das Proxy_Pass-Material enthält. Ich habe versucht, es einfach dort einzufügen, aber das endete nur mit einer Schleife.

Ich bin für jede Einsicht dankbar. Danke!

Antwort1

Das ist das Ergebnis, das funktioniert hat. Ich habe nachträglich noch ein paar Dinge für bestimmte Subdomains hinzugefügt, aber das war es, was es tatsächlich zum Laufen gebracht hat.

 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;
  }
}

Dann habe ich ein paar davon hinzugefügt, um die zufällig ausgewählten zu testen, sie haben prima funktioniert.

 # 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;
  }
}

Antwort2

So etwas sollte funktionieren. Das wird wahrscheinlich nicht genau so funktionieren, wie es ist, aber es sollte Ihnen eine allgemeine Strategie für Ihre eigene Entwicklung bieten. Wenn Sie möchten, dass jemand das alles für Sie erledigt und testet, sollten Sie einen Berater engagieren.

Ich gehe davon aus, dass Sie über eine unbegrenzte Anzahl von Subdomains verfügen.

// 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;
  }
}

verwandte Informationen