Единый url-адрес mod_rewrite продолжает возвращаться к исходному url-адресу

Я пытаюсь выполнить очень простую перезапись одного URL-адреса.

Это оно:

RewriteRule ^blog /?post_type=post [NC,L]

Я просто хотел бы, чтобы example.com/?post_type=pos перенаправлял и отображал example.com/blog.

Я пробовал несколько разных версий перезаписи, но все, чего я добился до сих пор, это то, что я не получаю 404 на example.com/blog, но продолжаю возвращаться к example.com/?post_type=post.

Я поместил RewriteRule прямо в начало файла .htaccess, что не помогло.

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

#Single URL
RewriteRule ^blog ?post_type=post [NC,L]

#http www rewrite
RewriteCond %{HTTP_HOST} ^instrumentrentalbarcelona.com [NC]
RewriteRule ^(.*)$ https://www.instrumentrentalbarcelona.com/$1 [L,R=301,NC]


# BEGIN WordPress
<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
1
0
94
2

Ответы 2

RewriteRule ^blog /?post_type=post [NC,L]

I would simply like example.com/?post_type=pos to redirect and display example.com/blog

Опубликованная вами директива делает прямо противоположное. Он "перезаписывает" (не "перенаправляет") с /blog<anything> на /?post_type=post

Для перенаправления на основе Строка запроса вам понадобится дополнительный состояние, который проверяет переменную сервера QUERY_STRING, потому что URL-адрес, который соответствует RewriteRuleшаблон, является только URL-путем.

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

RewriteCond %{QUERY_STRING} ^post_type=post$
RewriteRule ^$ /blog [QSD,R,L]

Это "перенаправляет" с example.com/?post_type=post (точно) на example.com/blog.

Флаг QSD (Apache 2.4+) необходим для удаления строки запроса из перенаправленного запроса. Если вы все еще используете Apache 2.2, вам нужно будет добавить подмена с ? вместо использования флага QSD. например. RewriteRule ^$ /blog? [R,L].

Нет, это временное (302) перенаправление. Если это должно быть постоянным, измените флаг R на R=301 - но только после того, как вы подтвердите, что он работает нормально.

Спасибо @DocRoot! Не уверен, что понимаю это на 100%, но я попробовал. Мой сервер находится на Apache 2.4+. Это приводит к тому, что сообщение /? Post_type = отправляется в / blog. Прогресс, но страница не работает?

Sascha Ehrentraut 31.10.2018 14:58

Если страница "сломана", значит, доступ напрямую к /blog нарушен? Чем он "сломан"?

DocRoot 31.10.2018 15:29

Приносим извинения, которые должны были включать следующее: screencast.com/t/1VESbupMr5JM Фактического каталога нет, если предположить, что он переписан, поэтому в нем не должно быть папки?

Sascha Ehrentraut 31.10.2018 15:37

На скриншоте показан цикл перенаправления. Это кажется невозможным с учетом приведенных выше директив? У вас есть что-нибудь еще в вашем файле .htaccess? Любые другие файлы .htaccess? Вы очистили кеш браузера? Предположительно, вы получаете ту же ошибку при прямом запросе /blog?

DocRoot 31.10.2018 16:46

Мне удается разрешить цикл (глупая ошибка, у меня был старый скрипт в другой части файла .htaccess). Я протестировал удаление всего из .htaccess, кроме того, что вы видите выше, и замену своего единственного URL-кода на код, который вы мне прислали: RewriteCond% {QUERY_STRING} ^ post_type = post $ RewriteRule ^ $ / blog [QSD, R, L] Теперь / блог показывает 404. Вы можете просмотреть все это здесь: docs.google.com/document/d/… еще раз спасибо

Sascha Ehrentraut 31.10.2018 17:28

Это перенаправление должно идти до фронт-контроллеру WordPress. (В том же месте, где вы указали это в своем вопросе.)

DocRoot 31.10.2018 17:32

У меня было это раньше, но все равно. Я переместил его обратно наверх. в примере, а также на фактическом .htaccess. Я получаю тот же результат.

Sascha Ehrentraut 31.10.2018 17:38

«все равно то же самое» - как в 404? Это перенаправляет? Что вы получите, если запросите /blog напрямую?

DocRoot 31.10.2018 19:06

Я только что попробовал это на вашем сайте, и похоже, что перенаправление работает нормально. Проблема, казалось бы, в том, что URL-адрес /blog недействителен и должен быть определен в WordPress? Если /blog не перенаправляет на действительную страницу вашего сайта, тогда это никогда не будет успешным?

DocRoot 31.10.2018 19:49

Спасибо за время и терпение. Да, я все еще получаю 404. Насколько я понимаю, действительной страницей является /? Post_type = post, а затем новый URL / блог - это просто переписывание, чтобы URL-адрес /? Post_type = post выглядел красивее. Если я удалю эту перезапись и поставлю /? Post_type = post, вы увидите все сообщения в блоге: screencast.com/t/ofJlpsGN6fNb (это не действительная страница?)

Sascha Ehrentraut 31.10.2018 21:41

Решено: я создал страницу под названием / Blog. Затем я изменил настройку в WordPress, чтобы отображать сообщения на этой странице. Настройка> Чтение> Отображается ваша домашняя страница> Страница сообщений: [Выберите «Блог» Страница создана] Реализована ваша оригинальная перезапись, и она отлично работает.

Sascha Ehrentraut 07.11.2018 12:34

Спасибо @DocRoot за помощь мне в этом. Ответ подробно описан ниже в ветке комментариев от DocRoot и меня. Просто подумал, что резюмирую это.

  • Я хотел показать страницу со всеми сообщениями в моем блоге.
  • Это можно сделать, если вы используете тип сообщения WordPress «Сообщение». example.com/?post_type=post
  • Я хотел, чтобы эта страница отображалась при переходе на example.com/blog.
  • Следующая перезапись работает для отображения желаемого URL: (еще раз спасибо @DocRoot)

    RewriteCond %{QUERY_STRING} ^post_type=post$
    RewriteRule ^$ /blog [QSD,R,L]
    
  • Но /blog давал 404. Итак;

  • Создайте страницу в WordPress под названием «блог»
  • Перейдите к: Настройка> Чтение> Отображение вашей домашней страницы> Страница сообщений: [Выберите страницу "блог"]
  • Сохраните и готово.

Другие вопросы по теме