Edward Black
Member
TL;dr
I created a location block (/de/forums/) outside of the nginx root folder but the php gets sent to the php compiler inside root so there is a directory mismatch. It wont take the defined php stack inside the new location block. Help!
The location block /de/forums/ works, but just for files, not for php. With php I get a "File not Found" because it uses the main root folder as base and not the new alias.
And I cant figure out how to force nginx to use the more specific php with the right
Following situation:
LEMP Stack with php7.2-fpm
Wordpress Multisite Installation on domain.com - configured to use Subdirectorys. There are two for this domain: domain.com/de/ and domain.com/en/. As you probably guessed for different language versions of a Blog. An example page is domain.com/en/contact-us and a blog post would be domain.com/en/this-is-a-blog-1451
So we have:
We want to add:
And this is how the folder stucture looks:
So we need to create a location blog for the forum folders. In theory, a more specific location block (/de/forums/) should take precedent over a general / so the block should always point to the forum and not to Wordpress.
Here is my full server block - with comments for you:
(the relevant location block is 4/5 at the bottom)
	
	
		
			
	
	
	
		
		
	
I tried:
The only thing that was working, was creating an actual folder like /var/www/domain.com/html/de/forums/index.php. But then I get an 404 with wordpress if I want to access /de/ and all the pages there, because of the try_files. I probably could work with if but thats not recommended as far as I read.
Also I can access files with the location blog (jpgs for example) - so the location block works but not the php.
The error message is File not found. So the forum phps getting sent to the php compiler, but there is - I believe - an adress mismatch with the general root and the new location root. I couldn't even access a phpinfo file.
Please help!
EDIT:
Further readings:
(aka I found helpful stuff here, but didn't solve my problem)
As most of them suggested, fastcgi_param SCRIPT_FILENAME $request_filename; should fix my problem. BUT... nginx just don't uses my php location with correctly set SCRIPT_FILENAME - it keeps using the "main" php location /
				
			I created a location block (/de/forums/) outside of the nginx root folder but the php gets sent to the php compiler inside root so there is a directory mismatch. It wont take the defined php stack inside the new location block. Help!
The location block /de/forums/ works, but just for files, not for php. With php I get a "File not Found" because it uses the main root folder as base and not the new alias.
And I cant figure out how to force nginx to use the more specific php with the right
fastcgi_param  SCRIPT_FILENAME  $request_filename;.Following situation:
LEMP Stack with php7.2-fpm
Wordpress Multisite Installation on domain.com - configured to use Subdirectorys. There are two for this domain: domain.com/de/ and domain.com/en/. As you probably guessed for different language versions of a Blog. An example page is domain.com/en/contact-us and a blog post would be domain.com/en/this-is-a-blog-1451
So we have:
    domain.com/de/
    domain.com/en/
    domain.com/en/contact-us
    domain.com/en/this-is-a-blog-1451We want to add:
    domain.com/de/forums/
    domain.com/en/forums/And this is how the folder stucture looks:
    /var/www/domain.com/
    /var/www/domain.com/html/
    /var/www/domain.com/html/index.php #(Wordpress)
    /var/www/domain.com/forum-de/index.php #(Xenforo)
    /var/www/domain.com/forum-en/index.php #(Xenforo)
    /var/www/domain.com/logs/
    /var/www/domain.com/ssl/
    /var/www/domain.com/wp-config.phpSo we need to create a location blog for the forum folders. In theory, a more specific location block (/de/forums/) should take precedent over a general / so the block should always point to the forum and not to Wordpress.
Here is my full server block - with comments for you:
(the relevant location block is 4/5 at the bottom)
		NGINX:
	
	server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name domain.com;
  
    root /var/www/domain.com/html;
    error_log /var/www/domain.com/logs/error.log warn;
    access_log /var/www/domain.com/logs/access.log;
    index index.php;
  
    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }
    # denies all hidden files
    location ~ /\. {
        deny all;
    }
    # Deny access to any files with a .php extension in the uploads directory
    # Works in sub-directory installs and also in multisite network
    # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
    location ~* /(?:uploads|files)/.*\.php$ {
        deny all;
    }
  
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
  
  
      
        location / {
                # 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 $uri/ /index.php?$args;
        }
      
        if (!-e $request_filename) {
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;
        rewrite ^(/[^/]+)?(/wp-.*) $2 last;                   
        rewrite ^(/[^/]+)?(/.*\.php) $2 last;                 
        }
      
    # indicate locations of SSL key files.
    ssl_certificate /var/www/domain.com/ssl/ssl.crt;
    ssl_certificate_key /var/www/domain.com/ssl/ssl.key;
  
    # Enable HSTS. This forces SSL on clients that respect it, most modern browsers. The includeSubDomains flag is optional.
    # see https://hstspreload.org/
    # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
  
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_ecdh_curve X25519:P-256:P-384:P-224:P-521;
  
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
  
    # generate by "openssl dhparam -outform PEM -out dhparam2048.pem 2048"
    ssl_dhparam /etc/nginx/ssl/dhparam2048.pem;
    #ssl_ecdh_curve secp384r1; SEEMS NOT TO WORK WITH CLOUDFLARE
    ssl_prefer_server_ciphers on;
  
    # Enable HSTS. This forces SSL on clients that respect it, most modern browsers. The includeSubDomains flag is optional.
    # see https://hstspreload.org/
    # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
  
    # DO NOT USE!!!!
    # DO NOT USEadd_header Public-Key-Pins 'pin-sha256="AKTUELLER-KEY-HASH"; pin-sha256="BACKUP-KEY-HASH"; max-age=31536000; includeSubDomains';
    # DO NOT USE!!!!
  
    ssl_session_cache shared:SSL:30m;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_session_tickets on;
    # generate with "head -c 48 /dev/urandom > /etc/nginx/ssl/nginx_ticketkey"
    ssl_session_ticket_key /etc/nginx/ssl/nginx_ticketkey;
    ssl_session_timeout 41m;
  
  
    # resolver conf
    resolver 8.8.8.8 8.8.4.4 valid=1200s;
    resolver_timeout 5s;
  
  
  
        location ~* \.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso)$ {
            # gzip_static off;
            add_header Access-Control-Allow-Origin *;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
            access_log off;
            expires 30d;
            break;
        }
        location ~* \.(js)$ {
            add_header Access-Control-Allow-Origin *;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
            access_log off;
            expires 30d;
            break;
        }
        location ~* \.(css)$ {
            add_header Access-Control-Allow-Origin *;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
            access_log off;
            expires 30d;
            break;
        }
        location ~* \.(html|htm|txt)$ {
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
            access_log off;
            expires 1d;
            break;
        }
        location ~* \.(eot|svg|ttf|woff|woff2)$ {
            add_header Access-Control-Allow-Origin *;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
            access_log off;
            expires 30d;
            break;
        }  
      
        location ^~ /de/forums/ {
            alias /var/www/domain.com/forum-de/;
            #also tried root
            index index.php index.html index.htm;
            try_files $uri $uri/ /de/forums/index.php?$uri&$args;
              #also tried just /index.php?$uri&$args;
          
          
        }
      
    location ~  ^/de/forums/(.+\.php)$ {
        alias var/www/domain.com/forum-de/;
         #also tried root  
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        include fastcgi.conf;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $request_filename;
        #also tried using the full path here
    }  
    #cloudflare stuff - cut out for shortness sake
    set_real_ip_from 103.21.244.0/22;
    #many more here
    # use any of the following two
    real_ip_header CF-Connecting-IP;
    #real_ip_header X-Forwarded-For;
  
  
  
        location ~ [^/]\.php(/|$)  {
            #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
            include fastcgi.conf;
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
            fastcgi_index index.php;
            fastcgi_connect_timeout 60;
            fastcgi_send_timeout 180;
            fastcgi_read_timeout 180;
            fastcgi_buffer_size 512k;
            fastcgi_buffers 512 16k;
            fastcgi_busy_buffers_size 1m;
            fastcgi_temp_file_write_size 4m;
            fastcgi_max_temp_file_size 4m;
            fastcgi_intercept_errors off;
      
    }
  
    }I tried:
- - Using location php as a sub location under /de/forums/
- - Using root instead of alias (what is wrong but I got desperate)
- - Not using fastcgi.conf link
- - Using $request_filename or /var/www/domain.com/html/forum-de/$fastcgi_script_name also /var/www/domain.com/html/forum-de$fastcgi_script_name
- - deleting the / php block, still didn't use the specific to the location /de/forums/
The only thing that was working, was creating an actual folder like /var/www/domain.com/html/de/forums/index.php. But then I get an 404 with wordpress if I want to access /de/ and all the pages there, because of the try_files. I probably could work with if but thats not recommended as far as I read.
Also I can access files with the location blog (jpgs for example) - so the location block works but not the php.
The error message is File not found. So the forum phps getting sent to the php compiler, but there is - I believe - an adress mismatch with the general root and the new location root. I couldn't even access a phpinfo file.
Please help!
EDIT:
Further readings:
(aka I found helpful stuff here, but didn't solve my problem)
- + https://stackoverflow.com/questions/17808787/file-not-found-when-running-php-with-nginx
- + https://stackoverflow.com/questions/42827222/file-not-found-nginx-php-fpm
- + many more - closed most of the tabs out of frustration...
As most of them suggested, fastcgi_param SCRIPT_FILENAME $request_filename; should fix my problem. BUT... nginx just don't uses my php location with correctly set SCRIPT_FILENAME - it keeps using the "main" php location /
			
				Last edited: 
			
		
	
								
								
									
	
								
							
							