Nginx: running wordpress in subfolder of a Symfony2 app

I run a Symfony2 app with nginx and want to integrate a wordpress installation in a subfolder of the public web-folder.

Example:

Read More
http://www.example.com          -> Symfony 2
http://www.example.com/magazin  -> WordPress

With the origin nginx configuration of the Symfony app i can sucessfully make requests to the start-page of wordpress and also the whole admin-area including plugin installation and so on.

But since i configured wordpress to use a custom url scheme “year/month/title” for the posts, the request ends up in a 404. I figured out, that not wordpress is the application who gets the request, but symfony, which certainly doesnt know what to do here. The URL that wordpress creates for a post, is correct (e.g. http://www.example.com/magazin/2015/12/my-interesing-post).

Is it possible, to extend the nginx configuration in a way to handle all requests below the specific folder “/magazin/” and if so, how?

This is my nginx configuration, which currently handles only the Symfony2 application:

server {
  listen *:80;
  server_name           www.example.de;


  index  app.php index.php index.html;

  access_log            /var/log/nginx/www.example.de.access.log combined;
  error_log             /var/log/nginx/www.example.de.error.log;

  location ~ .php$ {

    root          /data/www/www.example.de/current/web;
    include       /etc/nginx/fastcgi_params;
    try_files     $uri $uri/ /app.php?$query_string;

    fastcgi_pass  unix:/var/run/php5-fpm.sock;
    fastcgi_index app_prod.php;
    fastcgi_param X_FORWARD_PORT "80";
    fastcgi_param CUSTOMER_ENV customer_default;
    fastcgi_split_path_info ^(.+.php)(/.+)$;
    include fastcgi_params;
  }

  location / {

    root      /data/www/www.example.de/current/web;
    index     app.php index.php index.html;
    try_files $uri $uri/ /app.php?$query_string;
  }
}

Related posts

3 comments

  1. Extending to malcolms explanation, this should do the work:

    (If your log says that the path of the default nginx dir is prepended, you just have to define the root directory again)

    location /magazin {
        root      /data/www/www.example.de/current/web;
        index     index.php;
        try_files $uri $uri/ /magazin/index.php?q=$uri;
    }
    

    Additionally, I’m not pretty sure but I would suggest to insert this location block before any other location block that could fetch this route (location /magazin and afterwards location /).

  2. If you are using symfony2 with php7, you can try this configuration:

    server {
      listen    *:80;
      server_name www.example.com;
      root /var/www/example.com/web/;
      index index.php index.html index.htm;
      access_log off;
    
      location @rewriteapp {
           rewrite ^(.*)$ /app.php/$1 last;
      }
    
      location ~ .(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
           expires max;
           try_files $uri =404;
      }
    
      location / {
          index app.php;
          try_files $uri @rewriteapp;
      }
    
      # BLOG AREA START
      location @rewriteblog {
           rewrite ^(.*)$ /blog/index.php?q=$uri&$args;
      }
    
      location @rewriteblogadmin {
           rewrite ^(.*)$ /blog/wp-admin/index.php?q=$uri&$args;
      }
    
      location = /blog/favicon.ico {
          log_not_found off;
          access_log off;
      }
    
      location = /blog/robots.txt {
          allow all;
          log_not_found off;
          access_log off;
      }
    
      location /blog {
          # This is cool because no php is touched for static content.
          # include the "?$args" part so non-default permalinks doesn't break when using query string
          try_files $uri @rewriteblog;
      }
    
      location /blog/wp-admin {
          # This is cool because no php is touched for static content.
          # include the "?$args" part so non-default permalinks doesn't break when using query string
          try_files $uri @rewriteblogadmin;
      }
    
      # BLOG
      location ~ ^/(blog|blog/wp-admin)/(.*).php(/|$) {
          try_files $uri =404;
          fastcgi_index index.php;
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_split_path_info ^(.+.php)(/.+)$;
          include fastcgi_params;
    
          fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
          fastcgi_param DOCUMENT_ROOT $realpath_root;
    
          fastcgi_intercept_errors on;
          fastcgi_buffers 16 16k;
          fastcgi_buffer_size 32k;
      }
    
      # PROD
      # This rule should only be placed on your development environment
      # In production, don't include this and don't deploy app_dev.php or config.php
      location ~ ^/(app|config).php(/|$) {
          fastcgi_index app.php;
          fastcgi_pass unix:/run/php/php7.0-fpm.sock;
          fastcgi_split_path_info ^(.+.php)(/.*)$;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
          fastcgi_param DOCUMENT_ROOT $realpath_root;
      }
    
      # return 404 for all other php files not matching the front controller
      # this prevents access to other php files you don't want to be accessible.
      location ~ .php$ {
            return 404;
      }
    
      error_log /var/log/nginx/examplecom_error.log;
      access_log /var/log/nginx/examplecom_access.log;
    }
    
  3. You can add location with your subfolder:

    location /magazin {
        index index.php;
        try_files $uri $uri/ /magazin/index.php?q=$uri;
    }
    

Comments are closed.