Htaccess: adăugarea/eliminarea bară oblică finală din URL (Programare, Php, Apache,.Htaccess, Mod Rewrite)

Luke a intrebat.

Site-ul meu rulează un script numit -> WSS wallpaper script

Problema mea -> Am încercat să forțez eliminarea sau adăugarea de slash-uri la sfârșitul URL-ului meu pentru a preveni conținutul duplicat și, de asemenea, pentru a-mi curăța URL-urile.

Am încercat tot felul și am încercat tot ceea ce am putut gândi și încărcături de pe interwebs, dar încă nu am avut noroc! S-ar putea fi o soluție rapidă, dar m-am uitat atât de mult la ea încât probabil că sunt orb la ceva evident mort.

Așa că vă prezint cu toate .htaccess cod:

DirectoryIndex index.php

RewriteEngine on
RewriteRule ^download/([0-9]+)?/([0-9]+)x([0-9]+)/([^/.]+) image.php?id=$1&width=$2&height=$3&cropratio=$4&download=1 [L]
RewriteRule ^file/([0-9]+)?/([0-9]+)x([0-9]+)/([^/.]+) image.php?id=$1&width=$2&height=$3&cropratio=$4 [L]
RewriteRule ^preview/([0-9]+)?/([0-9]+)x([0-9]+)/([^/.]+) wallpaper_preview.php?id=$1&width=$2&height=$3&name=$4 [L]
RewriteRule ^thumbnail/([0-9]+)?/([0-9]+)x([0-9]+)/([^/.]+)/([^/.]+)/([^/.]+)/([^/]+) image.php?wallpaper_id=$1&width=$2&height=$3&cropratio=$4&align=$5&valign=$6&file=$7 [L]
RewriteRule ^cat/([0-9]+)?/([^/.]+)/p([0-9]+) index.php?task=category&id=$1&name=$2&page=$3 [L]
RewriteRule ^cat/([0-9]+)?/([^/.]+)/([0-9a-zA-Z?-]+)/p([0-9]+) index.php?task=category&id=$1&name=$2&sortby=$3&page=$4 [L]
RewriteRule ^cat/([0-9]+)?/([^/.]+)/([0-9a-zA-Z?-]+)-([0-9]+) index.php?task=category&id=$1&sortby=$3&page=$4 [L]
RewriteRule ^cat/([0-9]+)?/([^/.]+) index.php?task=category&id=$1&name=$2 [L]
RewriteRule ^tag/([^/.]+)/([0-9a-zA-Z?-]+)/([0-9]+) index.php?task=tag&t=$1&sortby=$2&page=$3 [L]
RewriteRule ^tag/([^/.]+) index.php?task=tag&t=$1 [L]
RewriteRule ^profile/([0-9]+)?/([^/.]+) index.php?task=profile&id=$1&name=$2 [L]
RewriteRule ^profile/comments/([0-9]+)?/([^/.]+) index.php?task=users_comments&id=$1&name=$2 [L]
RewriteRule ^page/([0-9]+) index.php?task=view_page&id=$1 [L]  
RewriteRule ^register index.php?task=register [L] 
RewriteRule ^lost-password index.php?task=lost_pass [L] 
RewriteRule ^links index.php?task=links [L]
RewriteRule ^news/item/([0-9]+)/([^/.]+) index.php?task=news&id=$1 [L]
RewriteRule ^news/page([0-9]+) index.php?task=news&page=$1 [L]
RewriteRule ^members/([^/.]+)-([^/.]+)/page([0-9]+)? index.php?task=member_list&sort=$1&order=$2&page=$3 [L]
RewriteRule ^members index.php?task=member_list [L]
RewriteRule ^messages index.php?task=messages [L]
RewriteRule ^submit index.php?task=submit [L]
RewriteRule ^search/([^/.]+) index.php?task=search&q=$1 [L]
RewriteRule ^search index.php?task=search [L]
RewriteRule ^submit index.php?task=submit [L]
RewriteRule ^r-([0-9]+)?-([0-9]+)? go.php?id=$1&ref=$2 [L]
RewriteRule ^r-([0-9]+)? go.php?id=$1 [L]
RewriteRule ^([^/.]+)/([0-9]+)/([^/.]+) index.php?task=view&id=$2&name=$3 [L]
RewriteRule ^news/([^/.]+) index.php?task=news&name=$1 [L]
RewriteRule ^profile/([^/.]+) index.php?task=profile&name=$1 [L]
RewriteRule ^news index.php?task=news [L]
RewriteRule ^page/([^/.]+) index.php?task=view_page&name=$1 [L]  
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/([0-9a-zA-Z'?-]+)/([0-9]+) index.php?task=category&name=$1&sortby=$2&page=$3 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/([^/.]+) index.php?task=view&name=$2 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+) index.php?task=category&name=$1 [L]


## www reslove ##
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
## www reslove ##

## index reslove ##
Options +FollowSymLinks
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ http://www.epicwallpaper.net/$1 [R=301,L]
## index reslove ##

Comentarii

  • De asemenea, dacă cineva poate repara băiatul rău ar putea posta un răspuns aici Vă mulțumesc –  > Por Luke.
  • Vă rugăm să postați codul aici. –  > Por Surreal Dreams.
  • Editează-ți postarea, lipește codul în postare, evidențiază-l, apasă „CTRL+K” pentru a-l formata ca și cod –  > Por Jon Lin.
  • Chiar aveți sau ? permise în URI-ul tău? Una dintre regulile de rescriere (în partea de jos) sugerează acest lucru. Mă îngrijorează faptul că acestea ar putea deruta serverul chiar înainte ca .htaccess să le poată procesa. –  > Por Phil Perry.
4 răspunsuri
Jon Lin

Chiar sub RewriteEngine On linie, adăugați:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R] # <- for test, for prod use [L,R=301]

pentru a aplica o politică de interzicere a barei de urmărire.

Pentru a aplica o politică de trailing-slash:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ /$1/ [L,R] # <- for test, for prod use [L,R=301]

EDITARE: a comentat linia R=301 părțile deoarece, așa cum s-a explicat într-un comentariu:

Aveți grijă cu asta R=301! Având-o acolo face ca multe browsere să blocheze fișierul .htaccess pe termen nelimitat: Acesta devine cumva ireversibil dacă nu puteți șterge browser-cache-ul de pe toate mașinile care l-au deschis. În timpul testelor, este mai bine să folosiți un simplu R sau R=302

După ce ați finalizat testele, puteți folosi R=301.

Comentarii

  • Doamne, aș putea să te sărut! A funcționat cu enforce a no-trailing-slash celălalt mi-a dat 500 server error Mulțumesc Jon Lin! –  > Por Luke.
  • 24

  • Regula no-trailing-slash nu funcționează dacă site-ul este localizat într-un director (cum ar fi example.org/blog/) –  > Por Gras Double.
  • Aveți grijă cu acest R=301! Faptul că îl aveți acolo face ca multe browsere să pună în cache fișierul .htaccess la nesfârșit: Devine cumva ireversibil dacă nu puteți șterge browser-cache-ul de pe toate mașinile care l-au deschis. Când testați, mai bine folosiți un simplu „R” sau „R=302” –  > Por Jonathan Weber.
  • Atunci când VirtualDocumentRoot este dezactivat, eliminați bara oblică de la început, adică:: $1 în loc de /$1 Și, @JonathanWeber , fișierul .htaccess nu este servit, dar antetul expires le spune browserelor cât timp să pună în cache o resursă. –  > Por twicejr.
  • @Nrc pentru că există și alte tipuri de corespondențe în afară de fișiere și directoare și există și posibilitatea ca o cerere să nu fie corespondentă nici cu un fișier, nici cu o directoare, dar să trebuiască să fie rescrisă. Negativul asigură că nu se trece peste ceva care fie a fost rescris, fie a fost deja asociat cu ceva din sistemul de fișiere. –  > Por Jon Lin.
Gras Double

Pentru a completa răspunsul lui Jon Lin, iată o tehnică de eliminare a barei de urmărire care funcționează și în cazul în care site-ul web se află într-un director (cum ar fi exemplu.org/blog/):

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [R=301,L]

De dragul completitudinii, iată o alternativă care subliniază că REQUEST_URI începe cu o bară oblică (cel puțin în .htaccess fișiere):

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteRule ^ /%1 [R=301,L] <-- added slash here too, don't forget it

Doar nu folosiți %{REQUEST_URI} (.*)/$. Pentru că în directorul rădăcină REQUEST_URI este egal cu /, este o bară oblică de început și ar fi interpretată greșit ca o bară oblică de sfârșit.

Dacă vă interesează să citiți mai mult:

(actualizare: această tehnică este acum implementată în Laravel 5.5)

Comentarii

  • Această variantă particulară este foarte utilă, mai ales atunci când se folosesc convenții URL moderne. Sper că nu vă supărați, o voi trimite la htaccess snippets repository. –  > Por alexw.
  • Acest lucru elimină problema atunci când REQUEST_URI (root) este interpretat ca o bară oblică finală, cauzând, de asemenea, o buclă infinită. Vă mulțumim –  > Por Ruslan Abuzant.
  • Da, răspunsul acceptat nu este valabil dacă site-ul web se află într-un director, dar acest răspuns cu RewriteCond %{REQUEST_URI} (.+)/$ elimină doar o ultimă bară oblică finală (de exemplu, sunt necesare mai multe redirecționări de la sth/// la sth// la sth/ la sth/ la sth). Pentru a elimina toate slash-urile finale într-o singură redirecționare, utilizați o soluție mai bună RewriteCond %{REQUEST_URI} (.+?)/+$ –  > Por mikep.
  • M-am gândit și eu la asta. Deși, rezultatul este corect și, având în vedere că este un caz limită, am preferat simplitatea codului. –  > Por Gras Double.
  • @GrasDouble , vă mulțumesc după ce am căutat această soluție de mult timp. am încercat nenumărate metode, dar a ta a funcționat bine! un mare mulțumesc. – user2711639
Svetoslav Marinov

Aceasta este ceea ce am folosit pentru ultima mea aplicație.

# redirect the main page to landing
##RedirectMatch 302 ^/$ /landing

# remove php ext from url
# https://stackoverflow.com/questions/4026021/remove-php-extension-with-htaccess
RewriteEngine on 

# File exists but has a trailing slash
# https://stackoverflow.com/questions/21417263/htaccess-add-remove-trailing-slash-from-url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.*)/+$ /$1 [R=302,L,QSA]

# ok. It will still find the file but relative assets won't load
# e.g. page: /landing/  -> assets/js/main.js/main
# that's we have the rules above.
RewriteCond %{REQUEST_FILENAME} !.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^/?(.*?)/?$ $1.php

Scout Hynson
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
## hide .html extension
# To externally redirect /dir/foo.html to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}s([^.]+).html
RewriteRule ^ %1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}s([^.]+)/s
RewriteRule ^ %1 [R=301,L]

## To internally redirect /dir/foo to /dir/foo.html
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^.]+)$ $1.html [L]


<Files ~"^.*.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>

Acest lucru elimină codul html sau php dacă îl completați. Vă permite să adăugați trailing slash și să apară, precum și url-ul fără trailing slash, toate ocolind codul 404. Plus un mic plus de securitate.

Comentarii

  • Bună ziua, Cum ai scrie asta pentru nginx? Am încercat să o execut într-un convertor aici: winginx.com/en/htaccess dar acest rezultat îmi dă o buclă infinită: # nginx configuration location / { rewrite ^(.*)$ /%1 redirect; rewrite ^(.*)$ /%1 redirect; rewrite ^/([^.]+)$ /$1.html break; } location ~ ^.*.([Hh][Tt][Aa]) { deny all; } –  > Por Asle.