Перенаправление .htaccess при редактировании строки запроса - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь перенаправить на новый домен, сохраняя строку запроса, но в измененном виде.

Например, я хочу перенаправить:

http://guides.freshstoreinstant.com/fresh-store-instant/how-to-find-your-amazon-affiliate-key-secret-key

до

https://guides.freshlabs.group/search?query=how+to+find+your+amazon+affiliate+key+secret+key

Итак, я хочу:

  1. Возьмите последнюю "папку" из исходного URL (how-to-find-your-amazon-affiliate-key-secret-key)

  2. Заменить - на +

  3. Добавить результат к https://guides.freshlabs.group/search?query= и перенаправить с 301

Я попробовал несколько вещей и немного узнал о .htaccess, но это меня озадачило

ОБНОВЛЕНИЕ

Это может быть проще, если использовать комбинацию .htaccess и PHP. Могу ли я использовать .htaccess, чтобы переписать все URL-адреса в index.php, а затем использовать PHP для замены символов и перенаправления?

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Вы можете сделать это, используя mod_rewrite в .htaccess. Попробуйте следующее в верхней части вашего .htaccess файла:

RewriteEngine On

RewriteRule ^(fresh-store-instant)/([^/]*)-([^/]*)$ $1/$2+$3 [N]
RewriteRule ^fresh-store-instant/([^/]+)$ https://guides.freshlabs.group/search?query=$1 [R=302,L]
  1. Первое правило многократно переписывает запрос (внутренне), заменяя все - (дефисы) на + во втором сегменте пути. Флаг N (next) явно запускает цикл перезаписи. Это следует использовать с осторожностью; как и в случае любого рекурсивного поведения, в какой-то момент ему необходимо завершить сбоем . (Примечание: A + в URL-пути - это просто литерал +.)

  2. После замены всех дефисов второе правило запускает внешнее перенаправление в другой домен, копируя второй сегмент пути (теперь содержащий +) в строку запроса в целевом URL-адресе. (Примечание: A + в части строки запроса URL-адреса рассматривается принимающим сервером как закодированный пробел .)

Обратите внимание, что это временное (302) перенаправление. Измените его на 301 (постоянный) только после того, как подтвердите, что он работает нормально - чтобы избежать проблем с кэшированием.

Очистите кеш браузера перед тестированием.

... при сохранении строки запроса, но в измененном виде

В вашем исходном URL-адресе нет строки запроса "keep"? Обратите внимание, что перенаправление выше перезаписывает любую строку запроса, которая может присутствовать в исходном URL. Включите QSA во второй RewriteRule, если вы хотите «добавить» строку запроса из запроса.


UPDATE:

первая «папка» может отличаться (например, http://guides.freshstoreinstant.com/fresh-store-builder/...)

Если существует ограниченное подмножество папок, то, вероятно, будет лучше явно назвать каждую из них, чтобы избежать потенциальных конфликтов с другими URL-адресами на вашем сайте. Например:

RewriteRule ^(fresh-store-(?:instant|builder))/([^/]*)-([^/]*)$ $1/$2+$3 [N]
RewriteRule ^fresh-store-(?:instant|builder)/([^/]+)$ https://guides.freshlabs.group/search?query=$1 [R=302,L]

Если вы сделаете начальный каталог полностью переменным (как показано ниже), то я могу представить, что это конфликтует с существующими URL:

RewriteRule ^([\w-]+)/([^/]*)-([^/]*)$ $1/$2+$3 [N]
RewriteRule ^([\w-]+)/([^/]+)$ https://guides.freshlabs.group/search?query=$1 [R=302,L]
0 голосов
/ 13 января 2019

Это невозможно с помощью модуля перезаписи apache, он не поддерживает такие действия поиска и замены. Это только переписывает. Если вы действительно не можете жить с неизмененной строкой, которую вы, вероятно, все еще можете разделить в своей логике обработки, то у вас есть следующие опции:

либо вводит другой слой перезаписи, основанный на некотором скриптовом движке, который принимает неизмененную строку, преобразует ее с помощью обычных строковых операций и выводит заголовки перенаправления

или вы можете что-то сделать с заменяющим модулем apache, но вам нужно установить и загрузить его, и его использование не совсем просто (сделал это, ворчал много ...)

или используйте странный, но работающий обходной путь:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4+$5+$6+$7+$8+$9 [R=301,QSA]
RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4+$5+$6+$7+$8 [R=301,QSA]
RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4+$5+$6+$7 [R=301,QSA]
RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4+$5+$6 [R=301,QSA]
RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4+$5 [R=301,QSA]
RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3+$4 [R=301,QSA]
RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2+$3 [R=301,QSA]
RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteRule ^/?fresh-store-instant/([^/-]*)-([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1+$2 [R=301,QSA]
RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteRule ^/?fresh-store-instant/([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1 [R=301,QSA]

Этот набор правил будет работать аналогично в конфигурации хоста http-серверов или в файле динамической конфигурации (файл стиля ".htaccess").


ОБНОВЛЕНИЕ:

Я понял, что ваш пример строки для преобразования содержит более 9 токенов, что является более или менее жестко заданным пределом обратных ссылок, поддерживаемых http-сервером apache. Вы можете изменить это, если сможете перекомпилировать источники, в этом случае вышеприведенное решение подходит и может быть расширено до нескольких токенов, с которыми вы чувствуете себя в безопасности.

Если это не вариант (как обычно), вам нужно попробовать что-то вроде этого:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteCond %{QUERY_STRING} (^|&)query=(.+)&|$
RewriteRule ^/?fresh-store-instant/?$ https://guides.freshlabs.group/search [R=301,QSA]

RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteCond %{QUERY_STRING} (^|&)query=(.+)(&|$)
RewriteRule ^/?fresh-store-instant/([^/-]*)[-]?(.*)/?$ /fresh-store-instant/$2?query=%2+$1 [N,QSD]

RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteCond %{QUERY_STRING} !(^|&)query=
RewriteRule ^/?fresh-store-instant/([^/-]*)/?$ https://guides.freshlabs.group/search?query=$1 [R=301,QSD]

RewriteCond %{HTTP_HOST} ^guides\.freshstoreinstant\.com$
RewriteCond %{QUERY_STRING} !(^|&)query=
RewriteRule ^/?fresh-store-instant/([^/-]*)[-](.*)/?$ /fresh-store-instant/$2?query=$1 [N,QSD]

Примечание: я не проверял это, просто записал, так что там может быть небольшая ошибка. Это должно работать, хотя. Он реализует стратегию многократного переписывания: он переписывает каждый токен в отдельности, «сохраняя» этот токен в предварительном аргументе запроса. Один за другим токены собираются до тех пор, пока не будет выполнено окончательное внешнее перенаправление, так как в запросе больше нет конвертируемых токенов.


И общее замечание: вы всегда должны размещать такие правила в конфигурации хоста http-серверов, а не использовать файлы динамической конфигурации (".htaccess"). Эти динамические конфигурационные файлы добавляют сложность, часто являются причиной неожиданного поведения, их трудно отладить, и они действительно замедляют работу http-сервера. Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет доступа к реальной конфигурации хоста http-серверов (читай: действительно дешевые поставщики услуг) или для приложений, настаивающих на написании своих собственных правил (что является очевидным кошмаром безопасности).

...