nginx stellt einige (aber nicht alle) PHP-Dateien als Downloads bereit

Lesezeit: 4 Minuten

Benutzeravatar von tytk
tytk

Ich installiere WordPress auf meinem Ubuntu-Server, auf dem nginx ausgeführt wird. Die Installation verlief ziemlich reibungslos (folgende LEMP installieren und WordPress installieren Tutorials – führte mich durch mysql, php5-fpm und WordPress-Setup) und scheint meistens zu funktionieren. Ich kann die WordPress-Admin-Seite anzeigen, Blog-Posts erstellen und diese Posts sogar anzeigen. Aber wenn ich versuche, auf die Homepage meines Blogs zuzugreifen (z. B. index.php), dient nginx der Datei als Download, anstatt sie auszuführen. Ich habe bereits die Konfigurationen in Nginx ausprobiert, die .php-Dateien als Downloads bereitstellt, anstatt sie auszuführen, ohne Erfolg.

Hier ist meine virtuelle Serverdatei:

server {
    listen 80;
    server_name my.domain.com;

    root /my/wordpress/home/dir;
    index index.php index.html index.htm;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;

        rewrite ^/([_0-9a-zA-Z-]+/)?wp-admin$ /$1wp-admin/ redirect;
        if (-e $request_filename) {
            rewrite ^/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) /$2 break;
        }
        rewrite ^/([_0-9a-zA-Z-]+/)?(.*\.php)$ /$2 break;
        rewrite ^(.*)$ /index.php break;
    }
}

Und nginx.conf:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Aus Gründen der Übersichtlichkeit habe ich kommentierte Zeilen entfernt. sudo nginx -t meldet keine Fehler.

Wie kann ich index.php dazu bringen, ausgeführt zu werden, anstatt als Download bereitgestellt zu werden? Danke für Ihre Hilfe.

Bearbeiten: Sieht so aus, als wäre es ein Browser-Caching-Problem. Ich habe versucht, zwischengespeicherte Daten der letzten 24 Stunden zu löschen, aber es hat nichts geändert. Nach dem Löschen alles Es wird jetzt ordnungsgemäß geladen, anstatt herunterzuladen. Es lädt auch auf anderen Browsern/Computern problemlos.

  • Was ist der Zweck der rewrite Regeln und die if. Das ist kein Standard und verursacht große Konflikte mit Ihnen try_files Regel.

    – Richard Smith

    17. Januar 2016 um 21:44 Uhr

  • Dies ist die nginx-Übersetzung der Konfiguration, die WordPress mir zum Hinzufügen sagte. Können Sie erklären, was der Konflikt ist? Nginx passt am längsten location möglich, also jede URL mit der Endung .php sollte vom ersten Block behandelt werden. Ich denke, das bedeutet, dass ein paar Zeilen aus dem 2. Block nicht verwendet werden, aber ich sehe nicht, warum dies Probleme verursachen würde. Ich bin neu bei nginx, also bitte erklären.

    – tytk

    19. Januar 2016 um 6:17 Uhr

  • Das erste Problem, das ich sehe, ist rewrite ^(.*)$ /index.php break; die, wenn sie ausgelöst wird, die Ausführung der PHP-Datei verhindern würde (siehe break hier). Das zweite Problem ist -e $request_filename das ist eine alte Art der Implementierung try_files. Eine Ressource für die Implementierung von WordPress auf nginx ist hier.

    – Richard Smith

    19. Januar 2016 um 8:56 Uhr

  • Danke @RichardSmith!! Ihr zweiter Link war genau die Konfiguration, die ich brauchte, und brachte mein Multisite-Setup zum Laufen. Alle anderen Blogs/Dokumentationen/Forenbeiträge, die ich gelesen hatte, stammten von vor vielen Jahren … Ich bin froh, dass die Nginx-Leute ihre eigene Anleitung für WordPress geschrieben haben.

    – tytk

    24. Januar 2016 um 7:15 Uhr

Für das Ausführen von WordPress hinter Nginx funktioniert dies für mich:

    location / {
            # try_files $uri $uri/ =404;
            try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    location /wp-content/updraft {
      deny all;
    }

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
            root /usr/share/nginx/html;
    }

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }

Ich empfehle auch, die Beispieldateien von zu überprüfen WordPress-Nginx Projekt. Insbesondere könnte Sie auch das interessieren globals/restrictions.conf Datei, die Ihre Installation etwas abhärtet. Wenn Sie mehrere WordPress-Sites auf demselben Server haben, können sie alle diese „globalen“ Konfigurationsdateien gemeinsam nutzen, was Ihnen das Leben als WordPress-Administrator erleichtert.

  • Danke für die Links! Markieren Sie Ihre Antwort als richtig, da sie wahrscheinlich am hilfreichsten ist. Ich konnte mein Problem lösen, indem ich meine Browserdaten aus meinem Browser löschte.

    – tytk

    19. Januar 2016 um 6:19 Uhr

1435480cookie-checknginx stellt einige (aber nicht alle) PHP-Dateien als Downloads bereit

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy