1

Here is my current server block (below). I have a separate wordpress blog installed on /blog and need to route /blog to the directory "/home/forge/example.com/public/blog".

I've tried a few options and at a loss so any advice is gratefully received.

# FORGE CONFIG (DOT NOT REMOVE!)
include forge-conf/example.com/before/*;

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;
    root /home/forge/example.com/public;

# FORGE SSL (DO NOT REMOVE!)
ssl_certificate /etc/nginx/ssl/example.com/server.crt;
ssl_certificate_key 
/etc/nginx/ssl/example.com/server.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'REMOVED FOR DEMO';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparams.pem;

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";

index index.html index.htm index.php;

charset utf-8;

# FORGE CONFIG (DOT NOT REMOVE!)
include forge-conf/example.com/server/*;


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

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt  { access_log off; log_not_found off; }

access_log off;
error_log  /var/log/nginx/example.com-error.log error;

error_page 404 /index.php;

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

    location ~ /\.(?!well-known).* {
        deny all;
    }

}

# FORGE CONFIG (DOT NOT REMOVE!)
include forge-conf/example.com/after/*;

Here is what I've tried adding:

location /blog/ {
    root /home/forge/example.com/public/blog;
    try_files $uri $uri/ /index.php?$query_string;
}

# the images need a seperate entry as we dont want to concatenate that with index.php      
location ~ /blog/.+\.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
    root /home/forge/example.com/public/blog;
}
# pass the PHP scripts to FastCGI server
location ~ /blog/.+\.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    allow 127.0.0.1;
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
}
  • 1
    Have you changed the WordPress home and site URL to point to `/blog` (see [this link](https://codex.wordpress.org/Changing_The_Site_URL))? Also, you might want to change your `try_files` statement to point to `/blog/index.php` to use pretty permalinks. – Richard Smith Oct 02 '17 at 11:40
  • Thanks, yes the Wordpress install is all setup as expected but I also have a site serving up on / that needs to also be accessible. Thanks – Lewis Boyles-White Oct 02 '17 at 12:04
  • Your original configuration should have worked. The edited configuration places the blog at `/home/forge/example.com/blog/blog/`. See [this link](http://nginx.org/en/docs/http/ngx_http_core_module.html#root). – Richard Smith Oct 02 '17 at 14:05

1 Answers1

0

Here is the snippet that is likely to work (I don't have Forge to test it)...

location /blog {
  try_files $uri $uri/ /blog/index.php$args$query_string;
  location ~ .+\.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;

    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
  }
}

# the following location is not needed - so commented out.
# location ^~ /blog/.+\.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
    # expires max;
# }

Getting back to why your config didn't work...

When you mention something like this...

location /blog {
  root /home/forge/example.com/public/blog;
  # ... other configuration lines
}

Nginx will look for "index.php" in a folder named "/home/forge/example.com/public/blog/blog" that would result in an error (404 or 403 if it is empty - try creating such as folder and try to setup a index.php file with <?php phpinfo(); in it). I have nested the PHP blocks. It is possible to put them un-nested like this...

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

# pass the PHP scripts to FastCGI server
location ^~ /blog/.+\.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    allow 127.0.0.1;
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
}

Please note the change in modifier ^~ in the second location block. Without it, the PHP location block of the main site (Laravel) might take precedence that would bring undesired results. More info on how location block works and the order of precedence is available at the official docs .

For sub-directory installation, the static files should work correctly without a need of separate location block.

Pothi Kalimuthu
  • 5,734
  • 2
  • 24
  • 37