web-dev-qa-db-fra.com

Nginx rewrite dans un sous-dossier (404)

J'ai un hôte de site sur un serveurNGINXqui fonctionnait normalement pour supprimer index.php dans la configuration de site nginx à l'aide de try_files.

Mais maintenant, je vais ajouter un blog là-dessus, où l'URL sera www.foo.com/blog, je peux accéder au blog et utiliser index.php?p=

Mais une fois que j’utilise pretty permalink avec Nginx Helper, www.foo.com/blog/2013/07/bar, j’obtiens 404

server {
  # don't forget to tell on which port this server listens
  listen 80;

  # listen on the www Host
  server_name foo.com;

  # and redirect to the non-www Host (declared below)
  return 301 $scheme://www.ultra-case.com$request_uri;
}

server {
  # listen 80 default_server deferred; # for Linux
  # listen 80 default_server accept_filter=httpready; # for FreeBSD
  listen 80;

  # The Host name to respond to
  server_name www.foo.com;

  # Path for static files
  root /web/foo.com

  #index file
  index index.php;

  #Specify a charset
  charset utf-8;

  # Custom 404 page
  error_page 404 /404.html;

  # Uri Rewrite

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

  location / {
    autoindex on;
    # This is cool because no php is touched for static content.
    # include tihe "?$args" part so non-default permalinks doesn't break when using query string
    try_files $uri $uri/ /index.php?$args;
  }
  location ~ \.php$ {
    #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    include fastcgi.conf;
    fastcgi_intercept_errors on;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
  }

  # Include the component config parts for h5bp
  include conf/h5bp.conf;
}
13
Cauliturtle

La réponse acceptée achemine tout dans index.php
Ceci cassera certains scripts, y compris wp-admin .

Vous pouvez utiliser:

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

Euh ... Merci pour tous vos commentaires et réponses. Mais finalement j'utilise cette méthode pour que ça marche

location /blog {
    index index.php;
    rewrite ^/blog/(.*)+$ /blog/index.php?$1; # it finally works
    # return 200 $request_uri; # it is for inspect what $request_uri is
    # try_files $uri $uri/ /blog/index.php$request_uri$is_args$args; # it gets 500 server error
}

Veuillez indiquer si le réglage actuel pose des problèmes. Je vous remercie!

15
Cauliturtle

Je suggère ce qui suit, pour attraper des permaliens sous sous-dossier/blog

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

Essayez ceci, j'ai changé ma réponse pour essayer d'imiter le même comportement que vous utilisez dans votre réécriture.

location ~ /blog(.*) {
    index index.php;
    try_files $uri /blog/index.php?$1&$args;
}
1
Mohammad AbuShady

J'ai trouvé qu'avec le permalien activé, j'avais besoin d'une combinaison des deux ensembles de réponses donnés ici, sinon

  1. Avec seulement la réécriture, aucun des fichiers statiques n'a été servi
  2. Avec seulement les fichiers try, les permaliens ne fonctionnaient pas

Cela fonctionne sur mon montage

location /blog/ {
      rewrite ^/blog/(blog/(tag|category|20??)/.*)+$ /blog/index.php?$1;
      try_files $uri $uri/ /blog/index.php?$args =404;
}
0
paulusm

Une solution universelle pour les jolies URL au niveau racine et un sous-dossier:

set $virtualdir "";
set $realdir "";

if ($request_uri ~ ^/([^/]*)/.*$ ) {
        set $virtualdir /$1;
}

if (-d "$document_root$virtualdir") {
        set $realdir "${virtualdir}";
}

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

Essaye ça

location /api {
    # example: http://demo.com/api/channels/dmzb
    root   /data/webserver/demo.com/api/web;
    rewrite ^/api/(.*) /$1 break;
    try_files $uri $uri/ /api/index.php?$args;

    location ~ ^/api/index\.php {
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;

        # fix request_uri
        set $changed_request_uri $request_uri;
        if ($changed_request_uri ~ ^/api(.*)) {
            set $changed_request_uri $1;
        }
        fastcgi_param REQUEST_URI $changed_request_uri;

        # fix script_filename
        fastcgi_split_path_info ^(?:\/api\/)(.+\.php)(.*);
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
}
0
jk2K

Pensez pour php, réécrire n'est pas nécessaire avec quelque chose comme ça:

location /app/ {
  include fastcgi_params;
  fastcgi_param  SCRIPT_FILENAME /path/to/your/app/index.php;
  fastcgi_pass php;
}

Avec le fastcgi suivant

upstream php {
    server unix:/var/run/php5-fpm.sock;
}
0
Jesús Germade