Перенаправление 301 из каталога в один файл
У меня возникли некоторые трудности с определением того, что должно быть простым. Я хочу 301 перенаправить все, что находится в каталоге, в один файл в новом месте.
В моем .htaccess я уже пробовал следующее...
Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/index.html
И это...
Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/
И это...
Redirect 301 /myDir http://www.mydomain.com/myNewDir
Проблема состоит в том, что каждый из них просто сопоставляет каждый файл в /myDir/ и добавляет его в конец целевого URL.
Погуглив, я увидел что-то, что говорило сделать это...
Redirect 301 ^/myDir(.*) http://www.mydomain.com/myNewDir
Но это просто делает то же самое... он сопоставляет существующее расположение файла с концом URL-адреса.
Было легко найти много ".htaccess redirect " учебники онлайн, но они, кажется, показывают только очевидные примеры, такие как "сопоставление файлов один к одному" или "сопоставление каталогов один к одному". Эти учебники также, кажется, пренебрегают объяснением различных соответствующих директив файлов и как их правильно использовать.
Это конкретная учетная запись хостинга является мусором,а также имеет установленные расширения FrontPage. Mod-rewrite терпит неудачу (ломает весь сайт), но строки Redirect 301 работают нормально. Поэтому, пока я не смогу переместить этот новый (не FrontPage) сайт на более надежный хостинг-аккаунт, мне нужно будет придерживаться Redirect 301 one-liner.
Как я могу просто использовать Redirect 301 для перенаправления всего внутри /myDir/ в тот же единственный файл, расположенный в /myNewDir/index.html? (Я бы предпочел использовать только /myNewDir/, Если это возможно). пожалуйста, подробно объясните файловые директивы, используемые в вашем решении.
Обновление:
Ранее принятый ответ не работает.
Пример:
RedirectMatch 301 /myDir1/(.*) http://mydomain.org/newpath/myDir1/index.html
...выдает ошибку "слишком много перенаправлений произошло при попытке открыть".
Это потому, что /myDir1/(.*) совпадает с в любом месте в строке, поэтому, если целевой URL содержит /myDir1/ в любом месте, а не только корень, он будет перенаправлен в неприятный петля.
Смотрите мой собственный опубликованный ответ для правильного решения.
2 ответа:
Я нашел ответ в одном из своих старых проектов.
Redirect 301это все неправильно для этого. Я действительно хотелRedirectMatch 301вместо этого.RedirectMatch 301 ^/myDir/(.*) http://www.example.com/myNewDir/Объяснение(Ы):
Http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch
"эта директива эквивалентна
Redirect, но использует стандарт регулярные выражения вместо простого префикса совмещение."Http://www.zytrax.com/tech/web/regex.htm
"
^(circumflex или caret) вне квадратных скобок означает смотреть только на начало целевой строки, например,^Winне будет найденоWindowsв строке 1, но^MozнайдетMozilla."И...
"
.(точка) означает любой символ(ы) в этой позиции, например,ton.найдетtons,toneиtonneauно неwanton, потому что у него нет следующий символ."И...
*(звездочка или звездочка) соответствует предыдущему символу 0 или более раз, например,tre*найдетtree(2 раза) иtread(1 раз) иtrough(0 раз).
Попробуйте это:
RedirectMatch 301 /myDir/.* http://www.mydomain.com/myNewDir/index.htmlСсылка: http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch .
Что касается скобок вокруг .* что касается, RedirectMatch использует стандартные регулярные выражения, что означает, что вы можете захватить соответствующие символы и использовать их в своем правиле перенаправления, назначая их как $1, $2 и т. д.
В регулярных выражениях * означает любое число повторений предыдущего символа. . - обозначает любой символ. Итак, комбинация .* скажет что этому шаблону соответствует любое число любого символа. Следовательно * . * означает, что этот паттерн будет соответствовать /myDir и /myDir/, и еще /myDir/тест.формат html. Так * . * может также использоваться