Apache „kapert“ eine URL von Nginx

Apache „kapert“ eine URL von Nginx

Ich habe einen Ubuntu-Server mit Apache, auf dem eine Wordpress-Site gehostet wird, die über HTTP zugänglich ist. Außerdem ist Nginx installiert, das eine Django-Site hostet, die nur über HTTPS zugänglich ist.

Was ich jetzt erreichen möchte, ist, dass example.comund www.example.comzu dem von Apache gehosteten Wordpress führen würden, während api.example.comzu dem von Nginx gehosteten Django führen würde. Das funktioniert im Moment, wenn ich einfach versuche, auf die Hauptseite unter zuzugreifen api.example.com, aber es gibt einen seltsamen Haken: Wenn ich versuche, auf api.example.com/admin(Django-Admin-Panel) zuzugreifen, wird die Seite auf die Wordpress-Admin-Anmeldeseite unter umgeleitet www.example.com/wp-admin. Warum ist das so?

Ich habe sogar versucht, die URL des Django-Admin-Panels in etwas anderes zu ändern. Dies führt wiederum zur Wordpress-404-Seite („Ups, diese Seite konnte nicht gefunden werden!“).

Es scheint also, dass der Teil der URL nach der Domain von Apache gekapert wird, obwohl er sich auf einer anderen Subdomain befindet. Was verursacht das und wie kann ich es beheben?

Die Apache-Site ist folgendermaßen konfiguriert:

<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /var/www/wp

    <Directory /var/www/wp>
        Options Indexes FollowSymlinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

Und die Nginx-Site ist folgendermaßen konfiguriert:

upstream app_server {
    server unix:/tmp/gunicorn.sock fail_timeout=0;
}

server {
    listen 443 ssl;
    charset utf-8;
    server_name api.example.com;

    ssl on;
    # Here be a lot of SSL configs

    location / {
        try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://app_server;
    }

    location /static {
        root /var/www/django/static;
    }
}

Schließlich ist mein DNS-Eintrag wie folgt eingerichtet:

A example.com 1.2.3.4
CNAME api example.com
CNAME www example.com

Vielen Dank im Voraus für Ihre Hilfe. Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

Antwort1

Sie geben diese URLs wahrscheinlich in dieser Kurzform in Ihren Webbrowser ein und dieser errät nicht richtig, was Sie möchten; er hat sich wahrscheinlich aus dem Verlauf gemerkt, dass er HTTPS verwenden soll, wenn Sie „api.example.com“ eingeben, aber für neue URLs wie „api.example.com/wasauchimmer“ hat er keinen Verlauf und versucht es deshalb zuerst mit HTTP.

Wenn Sie für all dies dieselbe IP-Adresse verwenden, unabhängig davon, dasshttps://api.example.com/* geht zum Prozess, der auf dem HTTPS-Port (443) lauscht,http://api.example.com/* wird weiterhin zum Prozess weitergeleitet, der auf dem HTTP-Port (80) lauscht.

Wenn Sie dies vermeiden und gleichzeitig die gleiche IP-Adresse beibehalten möchten, richten Sie im Nur-HTTP-Server einen virtuellen Host api.example.com ein, der jede empfangene Anfrage auf HTTPS umleitet.

Um sie tatsächlich auf die harte Tour aufzuteilen, fügen Sie dem Server eine neue IP-Adresse für api.example.com hinzu und lassen Sie die beiden HTTP(S)-Server jeweils auf ihrer eigenen IP lauschen. Aktualisieren Sie außerdem das DNS, sodass api.example.com auf die neue IP-Adresse verweist.

verwandte Informationen