Как один использовать mod_rewrite «двигаться» появление каталога сайтов в корень без фактического перемещения файлов? Пятно ошибки в моем коде! - PullRequest
0 голосов
/ 27 апреля 2011

Итак, у меня есть сайт, где я хочу такие страницы, как;

www.example.com/shop/index.php

(или любая другая страница в / shop / в этом отношении) теперь отображается как

www.example.com/index.php

но без фактического перемещения файлов, которые все еще находятся в / shop /, но теперь доступны через URL-адреса в /

Кажется, достаточно просто, и я могу сделать это самостоятельно, используя довольно стандартный RewriteRule. Второе требование заключается в том, чтобы ссылки на старый контент работали, поэтому я хочу сделать то же самое, но в другом направлении, но с использованием внешнего перенаправления 301 (без перезаписи), т.е.

www.example.com/shop/index.php

следует перенаправить на 301;

www.example.com/index.php

Опять же, достаточно просто само по себе. Но соедините их вместе, и вы получите прекрасную ошибку "Эта веб-страница имеет цикл перенаправления" при доступе к странице Однако я не понимаю, почему, поскольку одно правило является перезаписываемым, а другое - перенаправлением 301, и у них обоих есть флаг L, поэтому я подумал, что больше правил не обрабатывается. Итак, я нахожусь на пределе своего понимания этого материала mod_rewrite.

Чтобы проверить и не испортить мой сайт для посещающих людей, я использую каталоги / blob / и / b / с / b /, являющиеся каталогом new . Код, который у меня есть, дает цикл перенаправления:

RewriteRule ^blob/(.*)$ "http\:\/\/www\.example.com\/b\/$1" [R=301,NC,L]
RewriteRule ^b/(.*)$ /blob/$1 [NC,L]

Полагаю, это потому, что первое правило выполняется снова, как только второе, почему, если используется флаг 'L'? И какое условие я должен проверить или изменить, чтобы сделать так, чтобы правило перенаправления активировалось только в том случае, если исходный запрос предназначен для / blob / , а не переписанный URI.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2011

Без необходимости в дополнительном параметре запроса вы можете использовать следующие правила в вашем файле .htaccess:

Options +FollowSymlinks -MultiViews
RewriteEngine on

RewriteCond %{THE_REQUEST} ^GET\s/shop/ [NC]
RewriteRule ^shop/(.*)$ /$1 [R=301,NC,L]

RewriteCond %{REQUEST_URI} !^/shop/ [NC]
RewriteRule ^(.*)$ /shop/$1 [L]
  • Первое правило отправит 301 на любой запрос от /shop/foo до /foo в браузере, который является внешним перенаправлением
  • Второе правило будет внутренним перенаправлением любым /foo на /shop/goo без изменения URL-адреса в браузере, таким образом гарантируя, что ваши фактические файлы будут обслуживаться из каталога $DOCUMENT_ROOT/shop/.
0 голосов
/ 27 апреля 2011

Попробуйте следующее (я использовал ваши реальные примеры URL):

RewriteEngine On

RewriteCond %{QUERY_STRING} !rewrite
RewriteRule ^shop/(.*)$ http://localhost/$1 [R=301,NC,L]

RewriteCond %{REQUEST_URI} !^\/shop\/
RewriteRule ^(.*)$ /shop/$1?rewrite [NC,L,QSA]

Проблема, с которой вы сталкиваетесь, заключается в том, что когда mod_rewrite выполняет rewrite, оно фактически выполняет Internal Redirect, что заставляет правила применяться снова. Таким образом, это означает, что вы должны защититься от этого, в данном случае я добавил параметр rewrite к URL, который проверяет перенаправление.

Надеюсь, это поможет.

...