Nginx rewrite in subfolder (404)

2019-03-09 22:43发布

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;
}

8条回答
爷的心禁止访问
2楼-- · 2019-03-09 23:05

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;
}
查看更多
甜甜的少女心
3楼-- · 2019-03-09 23:07

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!

查看更多
爷、活的狠高调
4楼-- · 2019-03-09 23:10

I found that with permalink enabled, I needed a combination of both sets of answers given here, otherwise

  1. With only the rewrite, none of the static files got served
  2. With only the try files, the permalinks did not work

This is working on my set up

location /blog/ {
      rewrite ^/blog/(blog/(tag|category|20??)/.*)+$ /blog/index.php?$1;
      try_files $uri $uri/ /blog/index.php?$args =404;
}
查看更多
对你真心纯属浪费
5楼-- · 2019-03-09 23:16

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;
}
查看更多
Deceive 欺骗
6楼-- · 2019-03-09 23:17

A universal solution for pretty URLs in root and one subfolder level:

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;
}
查看更多
狗以群分
7楼-- · 2019-03-09 23:20

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;
}
查看更多
登录 后发表回答