Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nginx rewrite in subfolder (404)

I has a site host on a NGINX server which used to work fine to remove index.php in nginx site config using try_files.

But now I am going to add a blog on it, where the URL will be www.foo.com/blog, I can access the blog and use index.php?p=.

But, once I use pretty permalink with Nginx Helper, www.foo.com/blog/2013/07/bar, I get 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;
}
like image 764
Cauliturtle Avatar asked Jul 23 '13 08:07

Cauliturtle


4 Answers

The accepted answer routes everything through index.php.
This will break certain script includes, the wp-admin script being one of them.

You can use:

location /blog/ {
    index index.php;
    try_files $uri $uri/ /blog/index.php?$args;
}
like image 106
ereckers Avatar answered Nov 04 '22 11:11

ereckers


Um... Thank you for all comments and answer. But finally I use this method to get it works

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
}

Please point out if current setting has any problems. thank you!

like image 42
Cauliturtle Avatar answered Nov 04 '22 12:11

Cauliturtle


I would suggest the following, to catch any permalinks under subfolder /blog

location /blog {
    index index.php;
    try_files $uri $uri/ /blog/index.php?$args;
}
like image 5
Nicolas Guérinet Avatar answered Nov 04 '22 10:11

Nicolas Guérinet


Try this, I changed my answer to try to imitate the same behaviour you are using in your rewrite.

location ~ /blog(.*) {
    index index.php;
    try_files $uri /blog/index.php?$1&$args;
}
like image 1
Mohammad AbuShady Avatar answered Nov 04 '22 12:11

Mohammad AbuShady