Shopware hinter nginx proxy

Hallo Community,

ich habe einen nginx Server mit zwei Websites (dev.example.de und sw5.dev.example.de).

Beide zusammen bilden eine Website, bestehend aus zwei Anwendungen, welche Unterschiedliche PHP Versionen benötigen (daher auch angelegt als zwei Websites). In dem Unterordner /shop/ von sw5.dev.example.de ist Shopware5 installiert und als Shop-Url ist dev.example.de angegeben, sowie als virtuelle Url /shop.

Ich habe in der Konfiguration für dev.example.de folgenden Block eingebaut:

    location /shop {
        proxy_pass http://sw5.dev.example.de/shop/;
    }

Rufe ich nun http://dev.example.de/shop auf, so bekomme ich einen Umleitungsfehler angezeigt und in der Konsole, immer wieder die Umleitung auf sich selbst:

Die Antwort erhält in den Headerdaten jedesmal die Zeile:

Location http://dev.example.de/shop

Die Zeile ist jedesmal exakt gleich und stimmt auch mit der aufgerufenen URL überein. Dies geht so lange bis der Browser entscheidet, dass genug umgeleitet wurde und ich einen Umleitungsfehler erhalte.

 

Ich habe ein ähnliches Setup laufen, wo sich die beiden Apps allerdings auf unterschiedlichen Servern befinden und der Proxy durch einen Apache durchgeführt wird. Hier funktioniert alles ohne Probleme.

Hat jemand eine Idee woran das liegen könnte? Bzw. was hier das Problem darstellt?

LG Kasalop

Hab das auch schonmal für einen rudimentären Docker-Cluster gemacht: docker-cluster/nginx.conf at master · mnaczenski/docker-cluster · GitHub

Wichtig dafür ist, dass man den Proxy auch als TrustedProxy in die config.php von Shopware packt, damit die x-Header auch ausgewertet werden.

Hallo Moritz,

vielen dank für deine Antwort. Ich habe in der Datei  app/config/config.php

schon folgenden Eintrag hinzugefügt:

    'trustedproxies' => [
        'xxx.xxx.xxx.xxx',
    ],

Dort habe ich die IP Hinterlegt, die zum Server gehört auf dem die beiden Domains / Apps laufen.

Leider habe ich weiterhin den Umleitungsfehler.

Ich habe den Block jetzt dahin geändert:

    location /shop {
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://sw5.dev.example.de/shop/;
    }

Hast du noch eine Idee oder einen Weg wie ich herausfinden könnte, wie ich weiterforschen muss?

Lg Kasalop

Was hast du denn in den Shopeinstellungen > Shops konfiguriert?

Wenn du eine statische Datei wie eine Textdatei oder PHP-Info aufrufst, hast du das dann auch? So kannst ja schonmal ausschließen, dass die Weiterleitung von SW kommt.

Statische Dateien sind kein Problem. Die werden einfach ausgeliefert.

Die Einstellungen bei Shopeinstellungen > Shops lautet:

Host: dev.example.de
Virtuelle Url: /shop
SSL verwenden: off
Aktiv: on
Standardshop: on

Wären noch andere Einstellungen interessant?

Ich habe nochmal einen Test gemacht und das spannende ist: Nutze ich einen anderen Server mit installiertem Apache und nutze den ReverseProxy von Apache geht es. Mit der gleichen Konfiguration. Schalte ich wieder zurück und nutze den ReverseProxy des nginx auf dem gleichen Server auf dem auch das Shopware liegt dann geht es nicht und ich habe die Weiterleitungsschleife.

Also ich habe gerade nochmal getestet und hatte damit keine Probleme. Meine Nginx-config: 

    server {
        listen 80;
        listen [::]:80;

        client_max_body_size 128M;

        root /var/www/html/development/public;
        server_name development;

        
        location / {
            proxy_pass http://development/;
            proxy_redirect off;
            proxy_set_header REQUEST_URI $request_uri;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $server_name;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

Und Apache:

ServerName development

  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html/development/public

  Errorlog /dev/stderr
  Transferlog /dev/stdout

  
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
  

 # This is to forward all PHP to php-fpm.
 
   SetHandler "proxy:fcgi://scripthandler:9000/"
 

 
   ProxySet connectiontimeout=5 timeout=240
 



# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

 

Mein PHP war jetzt noch zusätzlich FPM - aber denke das spielt keine große Rolle.

Ich hab das aber auch alles durch Googeln damals ans Laufen bekommen und bin jetzt nicht der ausgewiesene Spezialist dafür :slight_smile:
Ist halt eher ein Hosting-Thema.

Danke Moritz,

bei mir läuft auch FPM. Aber leider geht es trotzdem nicht. Ich habe die Frage (inklusive Verlinkung dieses Threads) an den Hoster weitergeleitet. Ich hoffe von dieser Seite kommt eine Lösung :slight_smile:

Du kannst auch einfach eine Testinstallation komplett aus Produktionsumgebung raus nehmen. Ich teste das ganze im Moment selber noch, bisher scheint es zu laufen.

location /dev {
    alias /pfad/zu/deiner/dev;
    try_files $uri $uri/ @dev;    
    index shopware.php index.php;    

	location ~* "^/themes/Frontend/(?:.+)/frontend/_public/(?:.+)\.(?:ttf|eot|svg|woff|woff2)$" {
	#	expires max;
	#	add_header Cache-Control "public";
		access_log off;
		log_not_found off;
	}

	location ~* "^/web/cache/(?:[0-9]{10})_(?:.+)\.(?:js|css)$" {
	#	expires max;
	#	add_header Cache-Control "public";
		access_log off;
		log_not_found off;
	}

	location ~* ^.+\.(?:css|cur|js|jpe?g|gif|ico|png|svg|webp|html)$ {
		rewrite dev/files/documents/.* /engine last;
		rewrite dev/backend/media/(.*) /media/$1 last;

		#expires 1w;
		#add_header Cache-Control "public, must-revalidate, proxy-revalidate";
	
		#access_log off;
		#log_not_found off;

		try_files $uri $uri/ @dev;
	}

    location ~ \.php$ {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/pfad/zu/deinem/dev.sock;
        fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_intercept_errors on;
    }

}

location @dev {
    rewrite /dev/(.*) /dev/shopware.php?is_args$args/$1 last;
}