nginx fastcgi «Script principal inconnu» lors de la configuration de rép_utilisateur

10

Je déteste configurer nginx. C'est très compliqué. Comment faire fonctionner PHP dans mes répertoires utilisateur? Voici la partie pertinente de mon nginx.conf:

    location ~ ^/~(.+?)(/.*)?$ {
        autoindex on;
        autoindex_exact_size off;
        alias /home/$1/public_html$2;

        location ~ \.php {
            include /etc/nginx/fastcgi.conf;
            fastcgi_intercept_errors on;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
        }
    }

Cela me donne l'erreur: FastCGI sent in stderr: "Primary script unknown" while reading response header from upstreamdans le journal des erreurs nginx.

Voici mon /etc/nginx/fastcgi.conf:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

Je suppose que nginx ne résout pas correctement le nom du script. Je déteste devoir dire à nginx où chercher dans mon système de fichiers, en écrivant des expressions rationnelles personnalisées pour ce qui devrait être une fonctionnalité intégrée (ou au moins standardisée et documentée).

nnyby
la source
Où est le reste? c'est à dire /etc/nginx/fastcgi.conf?
Michael Hampton
@MichaelHampton Je viens d'ajouter cette info
nnyby

Réponses:

9

Le problème est que dans votre fastcgi.conf vous définissez SCRIPT_FILENAMEcomme $document_root$fastcgi_script_name;mais vous utilisez ensuite la aliasdirecive pour définir le chemin.

Vous devez mettre SCRIPT_FILENAMEà jour votre pour utiliser$request_filename

Vous pouvez également revenir à l'emplacement imbriqué si vous préférez. Si vous obtenez toujours cette erreur ensuite, j'ai documenté toutes les possibilités ici: http://blog.martinfjordvald.com/2011/01/no-input-file-specified-with-php-and-nginx/

Veuillez vérifier cela car il peut y avoir plusieurs autres causes.

Martin Fjordvald
la source
4

Lorsque vous définissez des redirections, des alias et que vous utilisez fastcgi dans la conf de votre site dans nginx, vous pouvez essayer ceci pour les laisser fonctionner:

Changement:

emplacement ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;
...
}


Dans:

emplacement ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ request_filename ;
fastcgi_param REQUEST_URI $ uri? $ args;
...
}

Si cela ne fonctionne pas, essayez d'utiliser comme indiqué ci-dessus sans REQUEST_URI, ce sera donc:

emplacement ~ \ .php $ {
...
fastcgi_param SCRIPT_FILENAME $ request_filename ;
...
}

Amtriorix
la source
Cela a fonctionné pour moi dans OSX Sierra
ajaybc
2

Essayez d'utiliser un locationbloc distinct pour les scripts PHP dans les répertoires utilisateur. Cela n'a pas besoin d'être imbriqué.

location ~ ^/~([^/]+)/(.+\.php)$ {
    alias /home/$1/public_html/$2;
    include /etc/nginx/fastcgi.conf;
    fastcgi_intercept_errors on;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
}
Michael Hampton
la source
Merci pour la suggestion! Je suis un peu plus près maintenant, mais j'obtiens toujours exactement la même erreur.
nnyby