Htaccess: добавить / удалить конечную косую черту из URL

Мой сайт запускает скрипт под названием -> WSS wallpaper script

Моя проблема -> Я пытаюсь принудительно удалить или добавить конечную косую черту в конец моего URL-адреса, чтобы предотвратить дублирование контента, а также очистить мои URL-адреса.

Я пробовал все виды и пробовал все, что мог придумать, и загружал из межсетевых экранов, но пока не было такой удачи! Это может быть быстрым решением, но я так сильно смотрю на него, что, вероятно, слеплю что-то мертвое.

Поэтому я представляю вам весь мой код .htaccess :

 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 ## 

Прямо под RewriteEngine On , добавьте:

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

для обеспечения соблюдения политики без возврата к косой чертой.

Чтобы обеспечить соблюдение политики завершающего слэша:

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

EDIT : прокомментировал R=301 часть, потому что, как объясняется в комментарии:

Будьте осторожны с тем, что R=301 ! Благодаря этому многие браузеры кэшируют файл .htaccess неограниченно : он каким-то образом становится необратимым, если вы не можете очистить кеш браузера на всех машинах, которые его открыли. При тестировании лучше пойдите с простым R или R=302

После завершения тестов вы можете использовать R=301 .

В дополнение к ответу Джона Лина, здесь есть метод без следа, который также работает, если веб-сайт находится в каталоге (например, example.org/blog/):

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

Для полноты здесь альтернатива подчеркивает, что REQUEST_URI начинается с косой черты (по крайней мере, в файлах .htaccess ):

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

Просто не используйте %{REQUEST_URI} (.*)/$ . Потому что в корневом каталоге REQUEST_URI равно / , ведущая косая черта, и это было бы неверно истолковано как конечная косая черта.

Если вам интересно узнать больше:

  • PR 3145 для Laravel
  • Обсуждение вопроса о фиксации 343c31e

(обновление: этот метод теперь реализован в Laravel 5.5)

 Options +FollowSymLinks RewriteEngine On RewriteBase / ## hide .html extension # To externally redirect /dir/foo.html to /dir/foo RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s([^.]+).html RewriteRule ^ %1 [R=301,L] RewriteCond %{THE_REQUEST} ^[AZ]{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> 

Это удаляет html-код или php, если вы его дополняете. Позволяет добавить конечную косую черту, и она появляется так же хорошо, как и URL-адрес без косой черты, минуя код 404. Плюс небольшая добавленная безопасность.

Это то, что я использовал для своего последнего приложения.

 # 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 # eg 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 

У меня есть ссылки, заканчивающиеся на .xml/ и мне нужно, чтобы слэш удалялся только тогда, когда ссылка заканчивается на ./xml .

Как я могу добиться этого в файле .htaccess ?