UPDATE 28.02.2019
The problem is the following part inside my server block:
 # Don't use `$uri` here, see https://github.com/yandex/gixy/issues/77 rewrite /wp-admin$ $scheme://$host$request_uri/ permanent; rewrite ^(/[^/]+)?(/wp-.*) $2 last; rewrite ^(/[^/]+)?(/.*\.php) $2 last; } Without it, everything finally works as intended. The problem is, that this is a needed part for a Wordpress-Multisite Installation to run. Without it, it is not possible to use wp-admin.
After locating the Problem - does anybody has an Idea how to solve it? (beside normal Wordpress installation and separating the forum via proxy as somebody suggested below)
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 "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-1451 We 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.php 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:
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!
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 /

location /de/forumsblocks, without any regex.