Мне нужно перенаправить мобильных пользователей на новый URL (/amp/...
), поэтому я добавил этот фрагмент кода в конфигурацию моего сайта Apache:
RewriteCond %{HTTP_REFERER} !^http://test.domain.com [NC]
RewriteCond %{REQUEST_URI} !^/amp/.*$
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^(.*)$ /amp/$1 [L,R=302]`
Проблема в том, что меня перенаправляют только при запросе домашней страницы (test.domain.com
), а не когда я запрашиваю любой другой URL-адрес (например, test.domain.com/category/web
). Есть идеи, что я делаю неправильно?
Это сайт Wordpress, и полный модуль перезаписи:
<Directory /var/www/project>
DirectoryIndex index.php
Options None FollowSymLinks
AllowOverride none
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^uploads/(.+) http://myCDN.com/uploads/$1 [R,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{HTTP_REFERER} !^http://test.domain.com [NC]
RewriteCond %{REQUEST_URI} !^/amp/.*$
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^(.*)$ /amp/$1 [L,R=302]
</IfModule>
</Directory>
Ваша переадресация должна быть удалена перед фронтальный контроллер (внутренняя перезапись). В передний контроллер перехватывает каждый запрос, кроме корня документа (домашней страницы). Таким образом, ваше перенаправление обрабатывается только для домашней страницы и просто игнорируется для всех других запросов.
Другими словами:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_REFERER} !^http://test.domain.com [NC]
RewriteCond %{REQUEST_URI} !^/amp/.*$
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^(.*)$ /amp/$1 [L,R=302]
RewriteRule ^uploads/(.+) http://myCDN.com/uploads/$1 [R,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Как правило, внешние перенаправления всегда должны выполняться до внутренней перезаписи.
Вы упомянули, что это находится в вашей «конфигурации сайта Apache». Я предполагаю, что эти директивы находятся в <Directory>
контейнер в пределах ваша "конфигурация сайта" (т.е. в контекст каталога). (Эти директивы просто не работают в конфигурация сервера или виртуальный хост контекст, т.е. прямо в "конфиге сайта".)