NGINX Rewrites Trailing Slash Wordpress

tglawe

New Member
Hallo zusammen,

leider habe ich ein etwas merkwürdiges Problem auf Unterseiten von Wordpress: Die funktionieren sowohl mit als auch ohne Trailing Slash. Wordpress erzeugt die Permalinks mit abschließendem Slash, die Seiten lassen sich aber auch ohne aufrufen.

Idealerweise sollte NGINX alle aufrufe ohne Trailing Slash weiterleiten an die URL mit Trailing Slash, also rewrite ^([^.]*[^/])$ $1/ permanent;

Das funktioniert aber irgendwie nicht.

Im Betrieb Plesk 17.8, PHP 7.2.10 läuft als FPM Anwedung bedient über NGINX.


Code:
fastcgi_read_timeout 300;

gzip on;
gzip_disable "msie6";

gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

if ($ssl_protocol = "") {
	rewrite ^/(.*) https://$server_name/$1 permanent;
}

if (!-e $request_filename) { rewrite ^(.*)$ /index.php?q=$1 last; break; }

rewrite /wp-admin$ $scheme://$host$uri/ permanent;
rewrite ^([^.]*[^/])$ $1/ permanent;

# try_files in locations is required to pre-empt the above rewrite

# Security directives of iThemes Security
include "/var/www/vhosts/tobiasglawe.eu/v4.tobiasglawe.eu/nginx.conf";
include "/var/www/vhosts/tobiasglawe.eu/v4.tobiasglawe.eu/wp-content/uploads/wpseo-redirects/.redirects";

# Now the generic stuff which is good for all PHP sites

location = /nginx.conf { deny all; }

location ~* \.(txt)$ { charset utf-8; }

# Pics and Fonts valid 90 Days in Cache
location ~* \.(png|jpg|jpeg|gif|ico|bmp|img|ttf|otf|eot|svg|woff|webp)$ {
	expires 4w;
	add_header Pragma public;
	add_header Cache-Control public;
	try_files $uri @fallback;
}

# Zips + PDF valid 4 weeks in Cache
location ~* \.(bz2|exe|gz|pdf|rar||tgz|zip)$ {
	expires 4w;
	add_header Pragma public;
	add_header Cache-Control public;
	try_files $uri @fallback;
}

# Media files (large) valid 2 months in Cache
location ~* \.(ac3|avi|flv|iso|mp3|mp4|mpeg|mpg|ogg|qt|rm|swf|wav)$ {
	expires 2m;
	add_header Pragma public;
	add_header Cache-Control public;
	try_files $uri @fallback;
}

# Possibly modified content valid 1 week in Cache
location ~* \.(js|css|htm|html|xhtml|xml|dat|doc|docx|dts|ppt|pptx|tar|txt|xls|xlsx)$ {
	expires 1w;
	add_header Pragma public;
	add_header Cache-Control public;
	try_files $uri @fallback;
}
 

XioniX

Blog Benutzer
Normalerweise liefert WP entweder oder aus, aber nicht beides. Deine Config ist leider nicht hilfreich, da übersät mit includes von denen keiner weiß was drin steht. Abgesehen davon, dass die config leicht suboptimal ist (zB https redirection in extra server block statt mit if, try_files statt if), gehe ich davon aus, dass dir diverse SEO-Plugins den Schlamassel eingebrockt haben.
 

tglawe

New Member
Vielen Dank, ich schaue es mir einfach noch mal in Ruhe an.

Die beiden via include eingebundenen Dateien enthalten folgendes:

nginx.conf
Code:
# BEGIN iThemes Security - Diese Zeile nicht verändern oder entfernen
# iThemes Security Config Details: 2
	# Hosts sperren - Sicherheit > Einstellungen > Benutzersperrung
	deny (IP Adresse);
	deny (IP Adresse);
usw. …

	# XML-RPC deaktivieren - Sicherheit > Einstellungen > WordPress-Optimierungen > XML-RPC
	location ~ xmlrpc.php { deny all; }
# END iThemes Security - Diese Zeile nicht verändern oder entfernen

###################################################################################################
# Rocket-Nginx
#
# Rocket-Nginx is a NGINX configuration to speedup your WordPress
# website with the cache plugin WP-Rocket (http://wp-rocket.me)
#
# Author: Maxime Jobin
# URL: https://github.com/maximejobin/rocket-nginx
#
# Tested with WP-Rocket version: 2.8.11
# Tested with NGINX: 1.11.3 (mainline)
#
# Version 1.2
#
###################################################################################################

# Add debug information into header
set $rocket_debug 0;

# HTTP Strict Transport Security (to overwrite default)
set $rocket_hsts_value "";

# WP-Content directory (leave as is if you did not alter WordPress' default value)
set $rocket_wpcontent_directory "$document_root/wp-content";

# WP-Content URL (leave as is if you did not alter WordPress' default value)
set $rocket_wpcontent_url "/wp-content";

###################################################################################################
# Do not alter theses values
#
set $rocket_bypass 1;				# Should NGINX bypass WordPress and call cache file directly ?
set $rocket_encryption "";			# Is GZIP accepted by client ?
set $rocket_file "";				# Filename to use
set $rocket_is_bypassed "No";		# Header text added to check if the bypass worked or not. Header: X-Rocket-Nginx-Bypass
set $rocket_reason "";				# Reason why cache file was not used. If cache file is used, what file was used
set $rocket_https_prefix "";		# HTTPS prefix to use when cached files are using HTTPS
set $rocket_hsts 0;					# Is HSTS is off (0) by default. Will be turned on (1) if request is HTTPS

# HSTS Default value : 1 year, include subdomains.
set $rocket_hsts_value_default "max-age=31536000; includeSubDomains";

###################################################################################################
# PAGE CACHE
#

# Is GZIP accepted by client ?
if ($http_accept_encoding ~ gzip) {
	set $rocket_encryption "_gzip";
}

# Is SSL request ?
if ($https = "on") {
	set $rocket_https_prefix "-https";
	set $rocket_hsts 1;
}

# If HSTS value is not set, use default value
if ($rocket_hsts_value = "") {
	set $rocket_hsts_value "$rocket_hsts_value_default";
}

# If HSTS is disabled, unset HSTS set for Rocket-Nginx configuration
if ($rocket_hsts = "0") {
	set $rocket_hsts_value "";
}

# File/URL to return IF we must bypass WordPress
# index-mobile.html
# index-mobile-https.html
set $rocket_end "/cache/wp-rocket/$http_host/$request_uri/index$rocket_https_prefix.html$rocket_encryption";
set $rocket_url "$rocket_wpcontent_url$rocket_end";
set $rocket_file "$rocket_wpcontent_directory$rocket_end";
set $rocket_mobile_detection "$rocket_wpcontent_directory/cache/wp-rocket/$http_host/$request_uri/.mobile-active";


# Do not bypass if it's a POST request
if ($request_method = POST) {
	set $rocket_bypass 0;
	set $rocket_reason "POST request";
}

# Do not bypass if arguments are found (e.g. ?page=2)
if ($is_args) {
	set $rocket_bypass 0;
	set $rocket_reason "Arguments found";
}

# Do not bypass if the site is in maintenance mode
if (-f "$document_root/.maintenance") {
	set $rocket_bypass 0;
	set $rocket_reason "Maintenance mode";
}

# Do not bypass if one of those cookie if found
# wordpress_logged_in_[hash] : When a user is logged in, this cookie is created (we'd rather let WP-Rocket handle that)
# wp-postpass_[hash] : When a protected post requires a password, this cookie is created.
if ($http_cookie ~* "(wordpress_logged_in_|wp\-postpass_|woocommerce_items_in_cart|woocommerce_cart_hash|wptouch_switch_toogle|comment_author_|comment_author_email_)") {
	set $rocket_bypass 0;
	set $rocket_reason "Cookie";
}

if (-f "$rocket_mobile_detection") {
	set $rocket_bypass 0;
	set $rocket_reason "Specific mobile cache activated";	
}

# Do not bypass if the cached file does not exist
if (!-f "$rocket_file") {
	set $rocket_bypass 0;
	set $rocket_reason "File not cached";
}

# If the bypass token is still on, let's bypass WordPress with the cached URL
if ($rocket_bypass = 1) {
	set $rocket_is_bypassed "Yes";
	set $rocket_reason "$rocket_url";
}

# Clear variables if debug is not needed
if ($rocket_debug = 0) {
	set $rocket_reason "";
	set $rocket_file "";
}

# If the bypass token is still on, rewrite according to the file linked to the request
if ($rocket_bypass = 1) {
	rewrite .* "$rocket_url" last;
}

# Add header to HTML cached files
location ~ /wp-content/cache/wp-rocket/.*html$ {
	add_header Vary "Accept-Encoding, Cookie";
	add_header X-Rocket-Nginx-Bypass $rocket_is_bypassed;
	add_header X-Rocket-Nginx-Reason $rocket_reason;
	add_header X-Rocket-Nginx-File $rocket_file;
	add_header Strict-Transport-Security "$rocket_hsts_value";
	expires 30d;
	
	#!# HEADER_HTTP #!#
	#!# HEADER_NON_GZIP #!#
}

# Do not gzip cached files that are already gzipped
location ~ /wp-content/cache/wp-rocket/.*_gzip$ {
	gzip off;
	types {}
	default_type text/html;
	add_header Content-Encoding gzip;
	add_header Vary "Accept-Encoding, Cookie";
	add_header X-Rocket-Nginx-Bypass $rocket_is_bypassed;
	add_header X-Rocket-Nginx-Reason $rocket_reason;
	add_header X-Rocket-Nginx-File $rocket_file;
	add_header Strict-Transport-Security "$rocket_hsts_value";
	expires 30d;
	
	#!# HEADER_HTTP #!#
	#!# HEADER_GZIP #!#
}

# Debug header (when file is not cached)
add_header X-Rocket-Nginx-Bypass $rocket_is_bypassed;
add_header X-Rocket-Nginx-Reason $rocket_reason;
add_header X-Rocket-Nginx-File $rocket_file;

# No HSTS header added here. We suppose it's correctly added in the site configuration


###################################################################################################
# BROWSER CSS CACHE
#
location ~* \.css$ {
	gzip_vary on;
	expires 30d;
	
	#!# HEADER_CSS #!#
}


###################################################################################################
# BROWSER JS CACHE
#
location ~* \.js$ {
	gzip_vary on;
	expires 30d;
	
	#!# HEADER_JS #!#
}


###################################################################################################
# BROWSER MEDIA CACHE
#
location ~* \.(ico|gif|jpe?g|png|svg|eot|otf|woff|woff2|ttf|ogg)$ {
	expires 30d;
	
	#!# HEADER_MEDIAS #!#
}
Die .redirects ist leer, da das Plugin die Redirects über PHP ausgeführt werden.
 

Top