/ / Vanity URLs ohne Schrägstriche auf Nginx - nginx, rewrite, trailing-slash

Vanity URLs ohne Schrägstriche auf Nginx - nginx, rewrite, trailing-slash

Mit Hilfe von @ jon-lin haben wir herausgefunden, wie man Schrägstriche auf Apache entfernt (Vanity-URLs ohne Schrägstriche auf Apache); jetzt, da wir planen, unsere Website auf Nginx zu betreiben, haben wir "dmag das Gleiche. Wir haben verschiedene Vorschläge aus Stackoverflow und anderswo ausprobiert, aber alle ergeben eine Endlosschleife (wahrscheinlich, weil Browser versuchen, die Schrägstriche wieder einzufügen). Unsere aktuelle Konfiguration (mit drei unserer Versuche - rewrite ^/(.*)/$ https://www.example.com/$1 permanent; rewrite ^/(.*)/$ https://www.example.com/$1; und rewrite ^/(.*)/$ /$1 permanent; - auskommentiert) ist:

server {
listen 80;
server_name  example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 80;
server_name  www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443;
server_name  example.com;
return 301 https://www.example.com$request_uri;
}

server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name www.example.com;

#rewrite ^/(.*)/$ https://www.example.com/$1 permanent;
#rewrite ^/(.*)/$ https://www.example.com/$1;
#rewrite ^/(.*)/$ /$1 permanent;

root /var/www/example.com/html;
index index.php index.html index.htm;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}

ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECD$
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_dhparam /etc/ssl/certs/dhparam.pem;

}

Wie kann das gemacht werden?

In unserem speziellen Fall mussten alle URLs von ihren Schrägstrichen entfernt werden. Das haben wir erreicht, indem wir Apache's httpd.conf hinzugefügt haben:

DirectorySlash Off

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/

Dann überschreiben Sie alle Einträge in /profiles/ wurde damit erreicht:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /profiles/$1 [NC,L]

Antworten:

1 für die Antwort № 1

Wenn Sie das Verzeichnis / profiles / nicht mehr verwenden, sollte dies funktionieren:

server {
...
root /var/www/example.com/html;
index index.php index.html index.htm;

location / {
try_files $uri @rewrite;
}
location @rewrite {
rewrite ^(.*[^/])$ $1/;
}
location ~ .php$ { ... }
}

In der obigen Konfiguration vermeiden wir die $uri/ Element auf der try_files da es eine Weiterleitung auslöst, die eine Nachverfolgung hinzufügt / zur aktuellen URL.

Wenn Sie eine Konfiguration ähnlich Ihrer vorherigen Apache-Konfiguration wünschen, sollte dies funktionieren:

server {
...
root /var/www/example.com/html;
index index.php index.html index.htm;

location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^(.*[^/])$ /profiles$1/;
}
location ~ .php$ { ... }
}

Wie Sie sehen können, die $uri/ Element schadet in dieser Situation nicht.

Nach Ihren Kommentaren und der letzten Bearbeitung kombiniert diese dritte (weniger elegante) Konfiguration die Funktionen der beiden anderen und ist eine enge (aber nicht exakte) Implementierung Ihrer Apache-Konfiguration:

server {
...
root /var/www/example.com/html;
index index.php index.html index.htm;

location = / { rewrite ^ /index.php; }
location / {
try_files $uri @rewrite;
}
location @rewrite {
if (-d $document_root/profile$uri) { rewrite ^ /profiles$uri/ last; }
if (-d $request_filename) { rewrite ^(.*[^/])$ $uri/ last; }
}
location ~ .php$ { ... }
}

Und schließlich weicht diese Version leicht von der Aufgabe ab. Der PHP-Ausführungsblock wird durch einen benannten Speicherort ersetzt. Aber es erlaubt die Verwendung von Kaskaden try_files Direktiven, das Schreckliche entfernen if Direktiven und Verwerfen index in diesem Prozess. Genießen:

server {
...
root /var/www/example.com/html;

location / {
try_files $uri $uri.html $uri/index.html /profiles$uri/index.html @php;
}
location @php {
try_files $uri.php $uri/index.php /profiles$uri/index.php =404;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
location ~ .php$ { rewrite ^(.*).php$ $1 permanent; }
}

Es ist eine Mischung aus slash-less und extension-less php, mit Ihren Profilen zwicken.


0 für die Antwort № 2

Kombiniert @ richard-smiths erste Option in seiner Antwort hier mit dem "Bösen" ifWir haben es geschafft:

    location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /profiles$1/ break;
}
try_files $uri @rewrite;
}

location @rewrite {
rewrite ^(.*[^/])$ $1/;
}

Jetzt sind alle nachfolgenden Schrägstriche weg und Profile in example.com/profiles/profile/ werden umgeschrieben example.com/profile