Htaccess: Ajouter / Supprimer slash de l'URL

mon site web exécute un script appelé - > WSS wallpaper script

mon problème - > j'ai essayé de forcer supprimer ou ajouter slash à la fin de mon URL pour empêcher le contenu dupliqué et aussi pour nettoyer mes URLs.

j'ai essayé toutes sortes et essayé tout ce que je pouvais penser et les charges des interwebs, mais pas de chance pour l'instant! Il pourrait être une solution rapide, mais j'ai regardé tellement je suis probablement aveugle quelque chose de mort évidente.

alors je vous présente tout mon code .htaccess :

DirectoryIndex index.php

RewriteEngine on
RewriteRule ^download/([0-9]+)?/([0-9]+)x([0-9]+)/([^/.]+) image.php?id=&width=&height=&cropratio=&download=1 [L]
RewriteRule ^file/([0-9]+)?/([0-9]+)x([0-9]+)/([^/.]+) image.php?id=&width=&height=&cropratio= [L]
RewriteRule ^preview/([0-9]+)?/([0-9]+)x([0-9]+)/([^/.]+) wallpaper_preview.php?id=&width=&height=&name= [L]
RewriteRule ^thumbnail/([0-9]+)?/([0-9]+)x([0-9]+)/([^/.]+)/([^/.]+)/([^/.]+)/([^/]+) image.php?wallpaper_id=&width=&height=&cropratio=&align=&valign=&file= [L]
RewriteRule ^cat/([0-9]+)?/([^/.]+)/p([0-9]+) index.php?task=category&id=&name=&page= [L]
RewriteRule ^cat/([0-9]+)?/([^/.]+)/([0-9a-zA-Z?-]+)/p([0-9]+) index.php?task=category&id=&name=&sortby=&page= [L]
RewriteRule ^cat/([0-9]+)?/([^/.]+)/([0-9a-zA-Z?-]+)-([0-9]+) index.php?task=category&id=&sortby=&page= [L]
RewriteRule ^cat/([0-9]+)?/([^/.]+) index.php?task=category&id=&name= [L]
RewriteRule ^tag/([^/.]+)/([0-9a-zA-Z?-]+)/([0-9]+) index.php?task=tag&t=&sortby=&page= [L]
RewriteRule ^tag/([^/.]+) index.php?task=tag&t= [L]
RewriteRule ^profile/([0-9]+)?/([^/.]+) index.php?task=profile&id=&name= [L]
RewriteRule ^profile/comments/([0-9]+)?/([^/.]+) index.php?task=users_comments&id=&name= [L]
RewriteRule ^page/([0-9]+) index.php?task=view_page&id= [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= [L]
RewriteRule ^news/page([0-9]+) index.php?task=news&page= [L]
RewriteRule ^members/([^/.]+)-([^/.]+)/page([0-9]+)? index.php?task=member_list&sort=&order=&page= [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= [L]
RewriteRule ^search index.php?task=search [L]
RewriteRule ^submit index.php?task=submit [L]
RewriteRule ^r-([0-9]+)?-([0-9]+)? go.php?id=&ref= [L]
RewriteRule ^r-([0-9]+)? go.php?id= [L]
RewriteRule ^([^/.]+)/([0-9]+)/([^/.]+) index.php?task=view&id=&name= [L]
RewriteRule ^news/([^/.]+) index.php?task=news&name= [L]
RewriteRule ^profile/([^/.]+) index.php?task=profile&name= [L]
RewriteRule ^news index.php?task=news [L]
RewriteRule ^page/([^/.]+) index.php?task=view_page&name= [L]  
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/([0-9a-zA-Z'?-]+)/([0-9]+) index.php?task=category&name=&sortby=&page= [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/([^/.]+) index.php?task=view&name= [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+) index.php?task=category&name= [L]


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

## index reslove ##
Options +FollowSymLinks
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ http://www.epicwallpaper.net/ [R=301,L]
## index reslove ##
60
demandé sur MrWhite 2014-01-29 01:28:49

4 réponses

juste au-dessous de la ligne RewriteEngine On , ajouter:

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

pour appliquer une politique d'exclusion.

Pour appliquer un trailing slash politique:

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

modifier : a commenté les parties R=301 parce que, comme expliqué dans un commentaire:

faites attention avec ce R=301 ! Avoir il y fait de nombreux navigateurs cache le.htaccess-file indefinitely : il devient en quelque sorte irréversible si vous ne pouvez pas vider le cache du navigateur sur toutes les machines qui l'ont ouvert. Lors de l'essai, mieux vaut aller avec simple R ou R=302

après avoir terminé vos tests, vous pouvez utiliser R=301 .

153
répondu Jon Lin 2017-05-04 15:18:09

pour compléter la réponse de Jon Lin, voici une technique de slash-no-trailing qui fonctionne aussi si le site est situé dans un répertoire (comme example.org/blog/):

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



Par souci d'exhaustivité, voici une alternative soulignant que REQUEST_URI commence par une barre oblique (au moins dans .htaccess des fichiers):

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

Juste ne pas utiliser %{REQUEST_URI} (.*)/$ . Parce que dans la racine répertoire REQUEST_URI égale / , la barre oblique principale, et il serait interprété à tort comme une barre oblique traînante.



Si vous êtes intéressé par Plus de lecture:

(mise à jour: cette technique est maintenant mis en œuvre dans Laravel 5.5)

64
répondu Gras Double 2017-11-16 10:19:26
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 ^([^\.]+)$ .html [L]


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

supprime le code html ou php Si vous le complétez. Permet d'ajouter un slash et venir ainsi que l'url sans le slash tout en contournant le code 404. Plus un peu de sécurité.

2
répondu Scout Hynson 2016-12-18 10:58:32

c'est Ce que j'ai utilisé pour ma dernière application.

# 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 ^/?(.*)/+$ / [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 ^/?(.*?)/?$ .php
0
répondu Svetoslav Marinov 2017-11-28 11:24:33