2012-05-01 2 views
6

Es ist schwierig, die Standortblöcke in der nginx-Konfiguration herauszufinden. Das ist, was ich habe:Es können keine Standortblöcke in nginx gefunden werden.

server { 
    listen   80; 
    server_name  _; 

    access_log  /var/log/nginx/example.com.access_log; 
    error_log  /var/log/nginx/example.com.error_log warn; 

    root    /var/www/root; 
    index    index.php index.htm index.html; 
    fastcgi_index  index.php; 

    location /wp/ { 
     root    /var/www/wordpress; 
     index    index.php index.htm index.html; 
     fastcgi_index  index.php; 
    } 

    location ~* \.php$ { 
     try_files   $uri =404; 
     keepalive_timeout 0; 
     fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_pass   127.0.0.1:9000; 
    } 
} 

Browsing/funktioniert wie erwartet und zeigt die Webseite in/var/www/root, aber wenn Orten arbeiten, wie ich denke, sie sollten gerade zu/wp mich auf die Wordpress nehmen sollte Installation in/var/www/wordpress. Ich erhalte alles:

404 Nicht

gefunden

nginx/0.7.67

Wenn ich das Verzeichnis/var/www/Wordpress-Verzeichnis/var/www/root/Wordpress verlagern und browse nach/wordpress alles ist perfekt.

Was mache ich falsch mit dem Standortblock ??

Ich habe Nginx nie zuvor konfiguriert und bin sowieso ein bisschen ein komplettes Web Newb.

Ich möchte in der Lage sein, mehr Standortblöcke für andere Anwendungen zu haben. Dies ist wirklich nur ein einfaches Beispiel, um hier zu posten.

Aktualisiert nginx zu Version in Debian Squeeze Backports. Keine Verbesserung:

404 Nicht

gefunden

nginx/1.1.19

+0

Haben Sie versucht,/wp/stattdessen zu gehen? –

+0

Sie möchten sich nicht vorstellen, wie veraltet nginx/0.7.67 ist. – Dayo

+0

Ich habe es auch versucht/wp /. Dies ist das Nginx aus den Debian 6-Repositories. Ich nehme an, dass Debian dazu neigt, ein wenig zurück zu kommen. Ich bevorzuge es, bei den Repos zu bleiben. – goji

Antwort

7

Der Grund, warum es nicht funktioniert, ist, dass ...

Auf Serverebene, haben Sie "root/var/www/root". Im Grunde wird jeder Standortblock diesen verwenden, es sei denn, er wird ausdrücklich überschrieben. Das ist eine gute Übung.

Sie haben es dann in den "wp" Location Block zu "/ var/www/wordpress" überschrieben. Der php-Standortblock verwendet jedoch weiterhin den Standardwert.

Jetzt, wenn Sie eine Anfrage an "/wp/folder_a/file_a.php", die physisch bei "/var/www/wordpress/folder_a/file_a.php" befindet, einfügen, trifft die Anfrage den PHP-Standort Block und Wenn der Root-Ordner für diesen Block aktiv ist, sucht er nach der Datei in "/var/www/root/folder_a/file_a.php". Als Ergebnis erhalten Sie eine "404 nicht gefunden".

Sie können die Root-Anweisung auf Serverebene in "/ var/www/wordpress" ändern und die Überschreibung in der wp-Position entfernen. Dies wird das Problem lösen, aber PHP-Skripte unter "/ var/www/root" funktionieren nicht mehr. Nicht sicher, ob Sie welche haben.

Wenn Sie PHP sowohl unter "/ var/www/root" und "/ var/www/Wordpress" ausführen müssen, müssen Sie dies tun:

server { 
    ... 
    root    /var/www/root; 
    index    index.php index.htm index.html; 
    # Keep fastcgi directives together under location 
    # so removed fastcgi_index 

    # Put keepalive_timeout under 'http' section if possible 

    location /wp/ { 
     root    /var/www/wordpress; 
     # One appearance of 'index' under server block is sufficient 
     location ~* \.php$ { 
      try_files   $uri =404; 
      fastcgi_index  index.php; 
      fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      fastcgi_pass   127.0.0.1:9000; 
     } 
    } 

    location ~* \.php$ { 
     try_files   $uri =404; 
     fastcgi_index  index.php; 
     fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_pass   127.0.0.1:9000; 
    } 
} 

Das heißt, Nest ein Duplikat php Standortblock unter dem wp-Standortblock. Es wird die Root-Direktive für wp erben.

Um zu helfen, Dinge zu erhalten und Bearbeitungen usw. zu erleichtern, können Sie die Fastcgi-Direktiven in eine separate Datei einfügen und bei Bedarf einbinden.

Also in/Pfad/fastcgi.params, Sie haben:

fastcgi_index  index.php; 
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_pass   127.0.0.1:9000; 

Ihre conf kann dann sein:

server { 
    ... 
    root    /var/www/root; 
    ... 
    location /wp/ { 
     root    /var/www/wordpress; 
     location ~* \.php$ { 
      try_files   $uri =404; 
      include /path/fastcgi.params; 
     } 
    } 

    location ~* \.php$ { 
     try_files   $uri =404; 
     include /path/fastcgi.params; 
    } 
} 

Auf diese Weise, wenn Sie irgendeine fastcgi param bearbeiten müssen, Sie bearbeiten sie nur an einem Ort.

PS. Das Aktualisieren Ihres nginx wird dies nicht lösen, da es kein Versions-Problem ist. Aktualisieren Sie es trotzdem!

+0

Danke. Ich hatte vermutet, dass es das falsche document_root verwendet, aber ich wusste nicht, dass Sie solche Location-Blöcke stapeln könnten! Ich poste zurück, wenn ich meinen Erfolg habe. – goji

+0

Gibt es eine Möglichkeit, genau zu sehen, was der Wert von SCRIPT_FILENAME ist, wenn ein PHP-Skript ausgeführt wird? – goji

+0

'location/wp /' muss 'location^~/wp /' sein, um zu verhindern, dass die äußere php-Position es überschreibt. Sehen Sie die [Dokumentation] (http://wiki.ninx.org/HttpCoreModule#location) – kolbyjack