Проблема с удалением двойных или более косых черт из URL с помощью .htaccess

Я использую следующий htaccess rul, чтобы удалить двойные или более косые черты из веб-адресов:

#remove double/more slashes in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

Это нормально работает для косых черт в середине uris, например, If use url:

http://demo.codesamplez.com/html5//audio

Он перенаправляется на правильный URL-адрес одиночного слэша:

http://demo.codesamplez.com/html5/audio

Но если URL-адрес содержит двойные косые черты в начале, ТОЛЬКО ПОСЛЕ доменного имени, тогда он не работает, например:

http://demo.codesamplez.com//html5/audio

его не перенаправляют.

Как я могу исправить приведенное выше правило, чтобы оно работало и для этого типа URL-адресов? Спасибо.


person Rana    schedule 13.06.2013    source источник


Ответы (5)


Попробуйте:

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

Он должен перенаправлять на одинарную косую черту в конце домена. И улучшение вашего:

RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=301,L]
person Marcel    schedule 29.08.2013
comment
Основываясь на вашем ответе, я заменил несколько дефисов: RewriteCond% {REQUEST_URI} ^ (. *) - (. *) $ RewriteRule. % 1-% 2 [R = 301, L] - работает, спасибо - person Michael d; 06.04.2017
comment
@Marcel Похоже, что параметры запроса не сохраняются в URL-адресе. - person Jun711; 30.01.2020

Для меня отлично работают следующие правила:

<IfModule mod_rewrite.c>
    RewriteBase /

    # rule 1: remove multiple leading slashes (directly after the TLD)
    RewriteCond %{THE_REQUEST} \s/{2,}
    RewriteRule (.*) $1 [R=301,L]

    # rule 2: remove multiple slashes in the requested path
    RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
    RewriteRule (.*) %1/%2 [R=301,L]
</IfModule>

Идея в значительной степени основана на ответе Марселя (спасибо!), Но этот немного более легкий и включает RewriteBase, что может быть полезно, если вы работаете с конкретными структурами подкаталогов. Кроме того, в ответе Марселя отсутствует объяснение, которое я хотел исправить:

Правило 1: {THE_REQUEST} содержит что-то вроде GET /index.html HTTP/1.1 (см. документы). Следовательно, если мы сопоставим первый пробел (\s), за которым следует несколько косых черт (/{2,}), мы сможем получить доступ к правильному URL-адресу без ведущей двойной косой черты через $1.

Правило 2: Регулярное выражение ^(.*)/{2,}(.*)$ разделяет URI запроса на несколько косых черт. %1/%2 затем снова объединяет две разделенные строки, но только с одной косой чертой.

person Simon    schedule 02.02.2018
comment
но предположим следующее: localhost/hey/thanks/a/lot////////// выполняется, результат localhost/hey/thanks/a/lot/ Я хочу удалить последнюю косую черту - person Alan Deep; 13.05.2018
comment
@AlanDeep Это другая проблема с другим решением. - person Simon; 14.05.2018
comment
Кажется, это не может обрабатывать более сложные случаи с несколькими вхождениями нескольких косых черт в URL - например, ///some//more///complicated///path// - person Petr H; 21.07.2020

Согласно этой ссылке, следующий код должен позаботиться о лишних косых чертах (где угодно) в URL-адресе.

RewriteCond %{THE_REQUEST} //
RewriteRule ^.*$ $0 [R=302,L,NE]
person Shital    schedule 09.05.2018
comment
Регулярное выражение // создаст цикл перенаправления (по сравнению с THE_REQUEST), если в строке запроса встречается несколько слэшей. Связанный ответ был обновлен для использования \s[^?]*//, что гарантирует совпадение нескольких косых черт только в URL-пути, а не в строке запроса (если она есть). - person MrWhite; 06.12.2020

Чтобы предотвратить долгое повторение символов в вашем URL-адресе, таких как:

http://demo.codesamplez.com/html5///////////////////////////////////////////audio

ты можешь сделать:

RewriteCond %{REQUEST_METHOD}  !=POST
RewriteCond %{REQUEST_URI} ^(.*?)(/{2,})(.*)$
RewriteRule . %1/%3 [R=301,L]

Он должен работать с:

http://demo.codesamplez.com//html5/audio

см. также: .htaccess - как удалить повторяющиеся символы из url?

person RafaSashi    schedule 19.10.2013
comment
не будет работать, если url будет domain.com// - перенаправляемый url будет таким же! - person dude; 28.04.2015
comment
Этот ответ достаточно хорош и работает с данным примером. В вашем случае используйте RewriteCond %{REQUEST_URI} ^(.*?)(/{2,})(.*)?$, чтобы объявить последнюю группу символов необязательной. В следующий раз, пожалуйста, спросите, прежде чем голосовать против. - person RafaSashi; 28.04.2015

Просто поместите приведенный ниже код в свой файл .htaccess. он удалит множественную косую черту из любого места. в конце URL-адреса и в середине URL-адреса.

<IfModule mod_rewrite.c>
RewriteBase /`enter code here`
RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule ^.*$ /$0 [R=302,L,NE]
#Remove slash anywhere from url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
# Rule 1: remove multiple leading slashes (directly after the TLD)
RewriteCond %{THE_REQUEST} \s/{2,}
RewriteRule (.*) $1 [R=301,L]
# Rule 2: remove multiple slashes in the requested path`enter code here`
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule (.*) %1/%2 [R=301,L]
</IfModule>
person Azhar    schedule 20.07.2021