Проблема при удалении двойных или более разрезов из URL-адреса по .htaccess

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

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

Это отлично работает для косых черт, возникающих в середине ури, например, если используется url:

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

Его перенаправляют на правильный URL-адрес единственного slahs:

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

Но если url содержит двойные слэши в начале, JUST AFTER имя домена, то там его не работает, например:

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

не перенаправляется.

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

Ответ 1

Попробуйте:

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

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

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

Ответ 2

Чтобы предотвратить повторное повторение символов в вашем 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?

Ответ 3

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

<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, что может быть полезно, если вы работаете со специфическими структурами подкаталогов. Кроме того, ответ Marcels не содержит объяснений, которые я хотел исправить:

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

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