Проблема при удалении двойных или более разрезов из 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
затем объединяет две разделенные строки снова, но с одним косой чертой в это время.