1

I have this set up under Apache but can't get it working under nginx. I have two websites one that covers everything, another under /news/. They run the same framework - Silverstripe.

Here is my nginx conf:

server {
      include mime.types;
      default_type  application/octet-stream;
      client_max_body_size 0; # Manage this in php.ini
      listen 80;
      listen 443 ssl;
      root /var/www/html/example/webroot;
      server_name example.com www.example.com;

      ssl on;

      ssl_certificate /etc/letsencrypt/live/example/cert.pem;
      ssl_certificate_key /etc/letsencrypt/live/example/privkey.pem;

      access_log /var/log/nginx/example/access.log main;
      error_log /var/log/nginx/example/error.log;

      # Defend against SS-2015-013 -- http://www.silverstripe.org/software/download/security-releases/ss-2015-013
      if ($http_x_forwarded_host) {
        return 400;
      }

      location ^~ /news/ {
          root /var/www/html/example2/webroot;
          try_files $uri /framework/main.php?url=$uri&$query_string;

          location ~ /framework/.*(main|rpc|tiny_mce_gzip)\.php$ {
          fastcgi_buffer_size 32k;
          fastcgi_busy_buffers_size 64k;
          fastcgi_buffers 4 32k;
          fastcgi_keep_conn on;
          fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
          fastcgi_index  index.php;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include        fastcgi_params;
        }

      }

      location / {
        try_files $uri /framework/main.php?url=$uri&$query_string;
      }

      error_page 404 /assets/error-404.html;
      error_page 500 /assets/error-500.html;

      location ^~ /assets/ {
        sendfile on;
        try_files $uri =404;
      }

      location ~ /framework/.*(main|rpc|tiny_mce_gzip)\.php$ {
        fastcgi_buffer_size 32k;
        fastcgi_busy_buffers_size 64k;
        fastcgi_buffers 4 32k;
        fastcgi_keep_conn on;
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
      }

      # Denials
      location ~ /\.. {
        deny all;
      }
      location ~ \.ss$ {
        satisfy any;
        allow 127.0.0.1;
        deny all;
      }
      location ~ \.ya?ml$ {
        deny all;
      }
      location ~* README.*$ {
        deny all;
      }
      location ^~ /vendor/ {
        deny all;
      }
      location ~* /silverstripe-cache/ {
        deny all;
      }
      location ~* composer\.(json|lock)$ {
        deny all;
      }
      location ~* /(cms|framework)/silverstripe_version$ {
        deny all;
      }
}

I've tried a few other things similar to this but it always ends up the same result, the server returning a Moved Permanently to the same URL.

3
  • 1
    Check your web application. There are no redirects in this nginx configuration. – Michael Hampton Jun 22 '19 at 4:05
  • The same code works under apache. I can only assume I'm not passing something or the root is not configured correctly under nginx so the application is having issues. – Rudiger Jun 22 '19 at 4:12
  • I see nothing obvious in the nginx configuration. Again, you need to debug your application. – Michael Hampton Jun 22 '19 at 4:12
0

Thanks to this walkthrough I figured it out:

location /news {
  alias /var/www/html/example2/webroot;
  try_files $uri  @news;

  location ~ /framework/.*(main|rpc|tiny_mce_gzip)\.php$ {
       fastcgi_buffer_size 32k;
       fastcgi_busy_buffers_size 64k;
       fastcgi_buffers 4 32k;
       fastcgi_keep_conn on;
       fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME $request_filename;
       include        fastcgi_params;
   }

}

location @news {
   rewrite /news(.*)$ /news/framework/main.php?/$1 last;
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.