Konfigurieren Sie nginx mit mehreren Speicherorten mit unterschiedlichen Stammordnern in der Subdomain


202

Ich möchte die Stamm-URL einer Subdomain und das Verzeichnis einer Subdomain in zwei verschiedenen Ordnern auf meinem Server bereitstellen. Hier ist die einfache Einrichtung, die ich habe und die nicht funktioniert ...

server {

    index index.html index.htm;
    server_name test.example.com;

    location / {
            root /web/test.example.com/www;
    }

    location /static {
            root /web/test.example.com/static;
    }
}

In diesem Beispiel wird test.example.com/die Indexdatei eingefügt/web/test.example.com/www

und gehen test.example.com/staticwürde die Indexdatei in bringen/web/test.example.com/static

Antworten:


238

Sie müssen die aliasDirektive verwenden für location /static:

server {

  index index.html;
  server_name test.example.com;

  root /web/test.example.com/www;

  location /static/ {
    alias /web/test.example.com/static/;
  }

}

Das Nginx-Wiki erklärt den Unterschied zwischen root und alias besser als ich kann:

Beachten Sie, dass es auf den ersten Blick der Root-Direktive ähnelt, sich jedoch nicht im Dokumentstamm befindet, sondern nur im Dateisystempfad, der für die Anforderung verwendet wird. Der Positionsteil der Anforderung wird in den Nginx-Ausgaben der Anforderung gelöscht.

Beachten Sie dies rootund aliasbehandeln Sie abschließende Schrägstriche unterschiedlich.


67
Er braucht nicht alias. Bitte lesen Sie die offiziellen Dokumente , nicht das von Benutzern ausgefüllte Community-Wiki. Quote: Wenn die Position mit dem letzten Teil des Werts der Direktive übereinstimmt, ist es besser, die Root-Direktive zu verwenden .
VBart

9
Dies hat bei mir funktioniert, außer dass ein abschließender Schrägstrich fehlt. Der Alias ​​sollte lauten: alias /web/test.example.com/static/;
Ajma

8
@VBart Die Dokumente sagen genau das, was Sie zitieren, aber sie rechtfertigen diese Anweisung überhaupt nicht - es scheint eine willkürliche Stilwahl zu sein. Sehen Sie einen logischen Grund dafür?
Mark Amery

104

Das Standortrichtungssystem ist

Als ob Sie alle Anfragen weiterleiten möchten, die beginnen /staticund Ihre Daten in vorhanden sind/var/www/static

Eine einfache Methode trennt also den letzten Ordner vom vollständigen Pfad

Vollständigen Pfad : /var/www/static

Letzter Pfad: /static und Erster Pfad:/var/www

location <lastPath> {
    root <FirstPath>;
}

Mal sehen, was Sie falsch gemacht haben und was Ihre Lösungen sind

Dein Fehler :

location /static {
    root /web/test.example.com/static;
}

Ihre Lösungen:

location /static {
    root /web/test.example.com;
}

2
Das hat mir geholfen: Mir wurde klar, dass ich entweder meinen Ordner umbenennen oder einen Symlink einrichten musste, damit die Dinge funktionieren.
cjm

3
Vielen Dank, ich habe genau so versagt :)
Bobmoff

10
Dies scheint eine ziemlich SCHWERE Einschränkung der Freiheit zu sein, das zu tun, was ich will. Ich möchte, dass URIs, die mit einem bestimmten Pfad beginnen, aus einem Verzeichnis bereitgestellt werden, das diesen URI-Pfad nicht in seinem physischen Dateipfad enthält. Mit dieser Lösung bin ich gezwungen, meine Dokumente unter einem Pfad, der mit "/ static" endet, auf die Festplatte zu legen. Das gefällt mir überhaupt nicht. Ich möchte absolute und vollständige Freiheit, die Dateien zu platzieren, wo immer ich will.
Szczepan Hołyszewski

48
server {

    index index.html index.htm;
    server_name test.example.com;

    location / {
        root /web/test.example.com/www;
    }

    location /static {
        root /web/test.example.com;
    }
}

http://nginx.org/r/root


2
Was ist der Unterschied mit gefragt?
TangMonk

5
@ Holz den Unterschied: root /web/test.example.com;statt root /web/test.example.com/static;. nginx ordnet den nach Speicherort angegebenen Pfad dem Verzeichnisbaum zu. Da der Pfad und das Quellverzeichnis denselben Namen haben, funktioniert es mit root.
rmoestl
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.