Intereting Posts

Перенаправление всех страниц, кроме одного на главную, через .htaccess

Я просто преобразовал старый веб-сайт в одностраничный WordPress.

На старом веб-сайте было несколько URL-адресов, теперь есть одна 1: домашняя страница. Плюс еще одна страница с политикой конфиденциальности.

Поэтому я хотел бы перенаправить все URLS, кроме тех, у кого есть «конфиденциальность» на главной странице.

Это то, что я пытаюсь, без успеха:

#custom redirects <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} !^/privacy-policy/ RewriteRule (.*) http://www.mywebsite.com/$1 [R=301,L] </IfModule> # BEGIN WordPress (standard wp htaccess rules) <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress 

Я слишком много перенаправляю: все URL-адреса перенаправляются бесконечно к себе, почему?

было бы лучше (если возможно) с использованием правила перенаправления вместо переписывания?

ОБНОВИТЬ

следующее предложение комментариев Я пробовал следующие пользовательские перенаправления (перед стандартными правилами WP):

 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} !^/privacy-policy$ RewriteRule (.*) http://mywebsite.com/ [R=301,L] </IfModule> 

Но все еще не работает

Проблемы

Я слишком много перенаправляю: все URL-адреса перенаправляются бесконечно к себе, почему?

Правила перезаписи Apache обрабатываются сверху вниз, поэтому ваше пользовательское правило перезаписи всегда обрабатывается в первую очередь. Флаг перенаправления R инструктирует Apache сообщать браузеру о новом запросе измененного URL вместо того, чтобы обслуживать место назначения переписывания по текущему адресу, а флаг L "last" сообщает Apache игнорировать все действующие правила перезаписи, поэтому всякий раз, когда применяется ваш RewriteRule , выполняется новый запрос, и ваши правила снова обрабатываются сверху.

Ваш RewriteCond инструктирует Apache обрабатывать исходящий RewriteRule всякий раз, когда путь URI запроса не начинается с /privacy-policy – поэтому практически каждый запрос приводит к перенаправлению до того, как любое из других правил в вашем .htaccess может быть оценено так же.

Поскольку @MarkKaplun упоминается в комментариях, $1 является обратной ссылкой, которая заменяется частью согласованного URI, содержащейся в первой «группе захвата» (первый набор скобок в шаблоне). Поскольку .* Буквально соответствует любому числу символов, в RewriteRule $1 заменяется весь путь URI.

По сути, ваши правила перезаписи:

 RewriteCond %{REQUEST_URI} !^/privacy-policy/ RewriteRule (.*) http://www.mywebsite.com/$1 [R=301,L] 

оцените «Если URI не начинается с /privacy-policy/ , попросите веб-браузер отправить новый запрос на http://www.mywebsite.com/(original URI path) .

Итак, для иллюстративных целей, скажем, вы перешли на http://www.mywebsite.com/blog/2015 ; вот что происходит с каждым запросом:

  1. /blog/2015 не начинается с /privacy-policy/ , сообщите обозревателю, чтобы перейти на http://www.mywebsite.com/blog/2015 .
  2. /blog/2015 не начинается с /privacy-policy/ , сообщите обозревателю, чтобы перейти на http://www.mywebsite.com/blog/2015 .
  3. /blog/2015 не начинается с /privacy-policy/ , сообщите обозревателю, чтобы перейти на http://www.mywebsite.com/blog/2015 .
  4. […]

Удаление ссылочной ссылки $1 из RewriteRule недостаточно, поскольку путь URI / (или просто пустой) по-прежнему не квалифицируется как начало с /privacy-policy/ , что приводит к поведению:

  1. /blog/2015 не начинается с /privacy-policy/ , сообщите обозревателю, чтобы перейти на http://www.mywebsite.com/ .
  2. / не начинается с /privacy-policy/ , сообщите обозревателю, чтобы перейти на http://www.mywebsite.com/ .
  3. / не начинается с /privacy-policy/ , сообщите обозревателю, чтобы перейти на http://www.mywebsite.com/ .
  4. […]

Вы можете проверить это поведение, взглянув на файлы журнала установки Apache.


Решение

Если вы не планируете использовать маршрутизацию адресов WordPress, нет никаких оснований держать правила перезаписи по умолчанию и больше стека поверх них. Создайте их для ваших нужд, а не добавляйте сложность:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^(/|index\.php)$ /index.php? [L] RewriteRule ^/?privacy-policy/?$ /index.php [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /? [L,R=301] </IfModule> 

В итоге,

  1. ,

    RewriteRule ^(/|index\.php)$ /index.php? [L]

    Если явно запрошено / или index.php , index.php , но отбросьте запрос (чтобы предотвратить смену страниц с помощью манипуляции query-var) и прекратите обработку перезаписи.

  2. ,

    RewriteRule ^/?privacy-policy/?$ /index.php [L]

    Если privacy-policy (с или без предшествующих и завершающих косых черт) была запрошена явно, используйте index.php и прекратите обработку перезаписи.

  3. ,
     RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /? [L,R=301] 

    Если запрошенное имя файла не является файлом, а не каталогом, сопоставьте один символ в любом месте (для применения правила независимо от URI) и сообщите обозревателю, чтобы он сделал новый запрос и / или отменил его запрос. Остановка обработки перезаписывает.

Стоит отметить, что ваш предполагаемый результат, вероятно, вызовет много неожиданного поведения – вы, вероятно, не сможете получить доступ к административной панели мониторинга, например. Вложения также могут быть нарушены. Но вышеприведенное должно, по крайней мере, служить хорошей отправной точкой для получения дополнительной информации о директивах перезаписи.

Пожалуйста попробуйте

 <IfModule mod_rewrite.c> RewriteRule ^/privacy-policy/? privacy-policy [L,NC] RewriteCond %{HTTP_HOST} ^(www\.)?oldsite\.com [NC] RewriteRule ^ http://mywebsite.com%{REQUEST_URI} [NE,R=301,L] </IfModule>