2

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

Example:

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

3 Answers 3

4

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 /).

Sign up to request clarification or add additional context in comments.

Comments

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

Comments

1

You can add location with your subfolder:

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

4 Comments

Unfortunatly, this will route all requests /magazin/* to index.php, also all .css/.js/.jpg-Requests, which end up now with 404
Try to change the last line to: try_files $uri $uri/ /magazin/index.php;
doesn't help. static files won't be accessed even if the path could be ensured being valid on the filesystem directly on the server
I'm not on nginx now, so cannot check, but another thing: add slash after magazin: location /magazin/ {

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.