2013-06-18 2 views
-2

на основе кода здесь: remove multiple trailing slashes mod_rewriteнесколько косых черт на url: как удалить?

У меня есть следующие Htaccess

Options +FollowSymLinks 
DirectorySlash Off 
RewriteEngine on 
RewriteOptions inherit 
RewriteBase/

# 
# remove multiple slashes from url 
# 
RewriteCond %{HTTP_HOST} !="" 
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$ [OR] 
RewriteCond %{THE_REQUEST} ^[A-Z]+\s(.*/)/+\sHTTP/[0-9.]+$ 
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L] 

# 
# Remove multiple slashes anywhere in URL 
# 
RewriteCond %{THE_REQUEST} ^(.*)//(.*)$ 
RewriteRule . %1/%2 [R=301,L] 

Но я узнал G-Bot дополз этот адрес: http://www.example.com/aaa/bbb/////////bbb-ccc/bbb-ddd.htm. (aaa, bbb, ccc, ddd, являются ключевыми словами в URL-адресе, не считаются литральными - i jut показывают шаблон URL-адреса)

Тестирование вышеуказанного URL-адреса на реальном сервере я узнал, что удаление косой черты Работа.

Любой может предложить любые советы или улучшения существующего кода? Спасибо

EDIT 1
@Sylwester при условии, что следующий код

# if match set environment variable and start over 
RewriteRule ^(.*?)//+(.*)$ $1/$2 [E=REDIR:1,N] 

# if done at least one. redirect with 301 
RewriteCond %{ENV:REDIR} 1 
RewriteRule ^/(.*) /$1 [R=301,L] 

Это не работает либо. Я все еще вижу ////// внутри url.
Я установил этот набор правил в самый верх моего файла htaccess, прямо под «RewriteBase /», чтобы не повлиять на другие правила, но ... ничего.
Любое другое предложение?

+2

Так почему ответы на этот другой вопрос не сработают для вас? – JJJ

+0

@Juhana Я понятия не имею – andrew

+0

Мне удалось найти ответ в указанной вами ссылке. Готов поспорить, вы тоже можете. – Sylwester

ответ

3

В каталоге и .htaccess сложно, так как apache на самом деле удалил избыточное сокращение для нас. Например. нет ровни // + больше, так мы проверяем% {REQUEST_URI}, так как он имеет оригинальный URI в то время как правило перезаписи должно соответствовать все:

# NB: Only works for per directory and .htaccess 
# Needs "AllowOverride All" in global config for .htaccess 
RewriteEngine On 
RewriteBase "/" 

Options +FollowSymlinks 
# Check if the REQUEST_URI has redundant slashes 
# and redirect to self if it has (which apache has cleaned up already) 
RewriteCond %{REQUEST_URI} //+ 
RewriteRule ^(.*) $1 [R=301,L] 

Если вы можете добавить глобальный конфиг я предпочел бы это в виртуальном хосте:

RewriteEngine On 
# if match set environment variable and start over 
RewriteRule ^(.*?)//+(.*)$ $1/$2 [E=REDIR:1,N] 

# if done at least one. redirect with 301 
RewriteCond %{ENV:REDIR} 1 
RewriteRule ^/(.*) /$1 [R=301,L] 
+0

Я проверил ваш код и отметил. См. Раздел edit1 в исходном сообщении. – andrew

+0

Я обновил свой ответ. Теперь он должен работать. – Sylwester

+0

Да, теперь он работает как ожидалось. Спасибо. – andrew

Смежные вопросы