2014-01-28 5 views
53

Мой сайт работает скрипт -> WSS обои сценарийHtaccess: добавить/удалить слэш из URL

Моя проблема -> Я пытался заставить удалить или добавить слэш в конце моего 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 ## 
+1

Также, если кто-нибудь может исправить плохого мальчика, не могли бы вы ответить здесь? Спасибо – Luke

+0

Пожалуйста, разместите здесь код. –

+0

Редактируйте сообщение, вставьте код в свой пост, выделите его, нажмите «CTRL + K», чтобы отформатировать его как код –

ответ

132

Прямо под 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.

+3

Бог, я мог бы поцеловать вас! Работал с принудительной отменой косой черты, другой дал мне ошибку 500 серверов. Спасибо, Джон Лин! – Luke

+13

Правило no-trailing-slash не работает, если сайт находится в каталоге (например, example.org/blog/) –

+3

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

56

В дополнение ответ Джон Лин, вот это техника не замыкающими слэш, который также работает, если сайт находится в директории (как 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 равен /, ведущий косой чертой, и это было бы неверно истолковано как конечная косая черта.


Если вы заинтересованы в более чтении:

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

+1

Этот конкретный вариант действительно полезен, особенно при использовании современных соглашений об использовании URL. Надеюсь, что вы не возражаете, я отправляю его в [htaccess snippets repository] (https://github.com/phanan/htaccess). – alexw

+1

Это устраняет проблему, когда REQUEST_URI (корень) интерпретируется как конечная косая черта, также вызывающая бесконечный цикл. Спасибо –

+0

Да, принятый ответ не передается, если веб-сайт находится в каталоге, но этот ответ с 'RewriteCond% {REQUEST_URI} (. +)/$' Удаляет только одну последнюю конечную косую черту (например, несколько перенаправлений, требуемых от sth ///to sth // to sth/to sth). Чтобы удалить все трейлинг-косые черты в одном перенаправлении, используйте лучшее решение 'RewriteCond% {REQUEST_URI} (. +?)/+ $ ' – mikep

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

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

+0

Привет, Как бы вы пишете это для nginx? Я попытался запустить его в конвертере: https://winginx.com/en/htaccess, но этот результат дает мне бесконечный цикл: '' # nginx configuration location/{ rewrite^(. *) $ /% 1 перенаправления; переписать^(. *) $ /% 1 redirect; переписать ^/([^ \.] +) $ /$1.html break; } местоположение ~ ^. * \. ([Hh] [Tt] [Aa]) { отрицать все; } '' – Asle

0

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

# 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 
Смежные вопросы