web-dev-qa-db-fra.com

nginx - liens permanents avec .php dans l'URL ne fonctionne pas

Je déplace un site d'un serveur Apache vers un serveur nginx. Beaucoup de pages ont une extension .php à la fin du permalien. Si vous essayez d’afficher ces pages, vous obtiendrez un nginx 404 introuvable. Cependant, ces pages ont bien fonctionné sur Apache. Voici la configuration du bloc serveur pour le site:

# Vhost Config: example.com

server {

  root /var/www/vhosts/sites/www.example.com/web;
  index index.php index.html index.htm;

  server_name example.com www.example.com;

  port_in_redirect off;

  location /Denied {
    return 403;
  }

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

  location ~* ^(/sitemap).*(\.xml)$ {
    rewrite ^ /index.php;
  }

  error_page 404 /404.html;
  error_page 500 502 503 504 /50x.html;

  location = /50x.html {
    root /usr/share/nginx/html;
  }
  location = /404.html {
    root /usr/share/nginx/html;
  }

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

  location ~* \.(js|css|png|jpg|jpeg|gif|ico|xml)(\?ver=[0-9.]+)?$ {
    expires 1w;
    log_not_found off;
  }

  location ~ /\. {
    deny all;
  }

  location = /ping.html
  {
    access_log off;
  }

}

J'ai commenté "#try_files $ uri = 404;" pour voir si cela fonctionnerait cependant qui a abouti à un "Fichier non trouvé". message.

Le problème principal est donc de faire en sorte que WordPress et nginx voient le lien permanent avec une extension .php avant d’essayer d’exécuter un fichier .php qui, selon lui, n’est pas un fichier réel.

Est-ce possible?

3
jpcadillac

J'ai fini par changer

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

à

location ~ ^/.*\.php$ {
    try_files $uri $uri/ /index.php?$args;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

Cela fonctionne maintenant, mais j'estime que c'est un problème de sécurité maintenant.

1
jpcadillac

Cela ressemble à un problème d’information sur le chemin.

http://wiki.nginx.org/PHPFcgiExample

    location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            if (!-f $document_root$fastcgi_script_name) {
                    return 404;
            }

            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
    }

Cela vous permettra peut-être d'aller dans la bonne direction, j'espère.

0
Dave Lozier