Перенаправление 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 5

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