Перенаправление 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. Так * . * может также использоваться