Как перенаправить все файлы в root только в другой каталог? - PullRequest
1 голос
/ 23 февраля 2020

Я давно искал, но не смог найти ничего похожего. У меня есть сайт с разнообразной структурой URL. Некоторые из URL-адресов root, некоторые другие имеют различные папки и пути. Теперь мне нужно иметь возможность перенаправить все пути из root в другую папку, но сохранить другую структуру для файлов из других папок

Например, этот шаблон:

  • /mypage следует перенаправить на /anotherfolder/mypage/content.php

  • /mysecondpage следует перенаправить на /anotherfolder/mysecondpage/content.php

В этом примере mypage и mysecondpage - переменные, которые должны быть переданы в место назначения.

Но для страниц, приходящих из другой папки в root, мне нужен еще один шаблон в месте назначения. Например:

  • /somerootfolder/somepage следует перенаправить на someotherfolder/somepage.php

В этом примере somepage является шаблоном, который должен пройти к месту назначения.

Второй тип перенаправления не должен изменять первый и наоборот.

То, что я сделал для первой директивы (любые файлы в root, но только в root должны перенаправлять в другую папку) is:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /foldername/$1/content.php [L]

... где $1 равно названию от (.*). И это само по себе работает очень хорошо, удерживая старый URL, но получая содержимое из другой папки.

Для второй директивы (файлы из папки в другую папку с именем и добавлением расширения) я сделал:

RewriteRule ^foldername/(.*) /anotherfolder/$1.php [L]

... где $1 равно (.*). И все внутри foldername сохраняет свой старый URL, но получает содержимое от anotherfolder.

Все работает отдельно, но не вместе. Есть идеи?

1 Ответ

1 голос
/ 23 февраля 2020

Ваше второе правило соответствует переписанному URL из первого правила, поэтому перезаписывается во второй раз - во что-то искаженное, например /anotherfolder/mypage/content.php.php. Если бы не условие первого правила, которое проверялось по переменной окружения REDIRECT_STATUS, у вас была бы перезапись l oop.

Казалось бы, вы сможете избежать конфликта (и условие в правилах (оба правила ), просто указав регулярное выражение более c - вы хотите сопоставлять только сегменты пути в root или подкаталоге, а не все .

Вместо этого попробуйте следующее:

# Rewrite root files to another folder
RewriteRule ^([^/]+)$ /foldername/$1/content.php [L]

# Rewrite requests for /foldername/somepage to /anotherfolder
RewriteRule ^foldername/([^/]+)$ /anotherfolder/$1.php [L]

Сделав регулярное выражение более ограничительным , мы избежали конфликта.

...