Декодирование Переписанный URL с использованием mod_rewrite - htaccess - regex

Я использую Apache 2.4. Я установил и настроил HTTP-сервер Apache для размещения моего приложения invision, мое приложение связано с внешними документами Google. Я пытаюсь выполнить перенаправление на внешний документ Google из приложения, но Apache это не нравится.

Это URL-адрес, к которому он пытается получить доступ

http://example.com/redirect? 
url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1234567890%2Fviewform

Я переписал URL-адрес следующим образом:

RewriteCond %{QUERY_STRING} ^(.+)(forms.+)
RewriteRule ^redirect(.*) https://docs.google.com/%2 [R=302,QSD]

и после перезаписи , Я остался с этим.

https://docs.google.com/forms%2Fd%2Fe%2F12345678900%Fviewform

Это делает то, что должно, и если я лично заменю% 2F на '/', это приведет меня к документу, так что я знаю, что он близок. URL-адрес перенаправляет на диск Google, только я получаю сообщение

404 страница не найдена

с диска Google. Я знаю, что мне нужно декодировать URL-адрес, чтобы успешно перейти к документу, но как я могу это сделать с помощью .htaccess или других средств?

AllowEncodedSlahes on (I have also tried NoDecode) //VirtualHost conf and apache conf

Я попытался сопоставить и заменить% 2F с помощью Regex, но они не распознаются, и я получаю 500 - Внутренняя ошибка сервера.

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

1
задан 25 February 2019 в 11:08
1 ответ

и после перезаписи я остался с этим.

 https://docs.google.com/forms%2Fd%2Fe%2F12345678900%Fviewform
 

Хотя этого не произошло бы с опубликованными вами директивами, если вы не добавили флаг NE ( noescape ) в директиву RewriteRule . (Вместо этого он будет дважды закодирован ). Использование флага NE - это шаг в правильном направлении, однако нам нужен еще один шаг для декодирования URL-адреса полученного URL-пути ...

Примечание: Полученный URL-путь вы опубликованный выше имеет опечатку (учитывая ваш пример входного URL). Последний % 2F отсутствует; вместо этого у вас 0% F . Он должен читать: forms% 2Fd% 2Fe% 2F1234567890% 2Fviewform

Google, похоже, запускает 404 из-за закодированных косых черт в URL-пути (как вы предлагаете), так же как Apache будет делать по умолчанию . Установка AllowEncodedSlashes On (в vHost) не поможет сразу в этом, так как 404 запускается Google. Однако это должно быть установлено, чтобы мы могли обрабатывать URL дальше и расшифровывать закодированные косые черты перед выполнением окончательного перенаправления.

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

# Set in your vhost (server config)
AllowEncodedSlashes On

Затем в .htaccess (или соответствующий раздел ):

RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.+)(forms.+)
RewriteRule ^redirect$ /redirect/%2 [NE,QSD]
RewriteRule ^redirect/(.+) https://docs.google.com/$1 [R=302,L]

Итак, учитывая начальный запрос к вашему серверу из:

/redirect?url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1234567890%2Fviewform
  1. Первое RewriteRule внутренне перезаписывает ] запрос (все еще на вашем сервере):

     / redirect / forms% 2Fd% 2Fe% 2F1234567890% 2Fviewform
     

    Это «разрешено» (и не вызывает 404) из-за директивы AllowEncodedSlashes On , которую вы установили в конфигурации сервера.

  2. Затем второе RewriteRule декодирует URL-путь (от % 2F до / ) и выполняет внешнее перенаправление на:

     https://docs.google.com/forms/d/e/1234567890  / viewform
     

    Apache автоматически декодирует URL-адрес URL-пути перед применением шаблона RewriteRule . Соответствующая часть захватывается и передается в замену в обратной ссылке $ 1 .

0
ответ дан 4 December 2019 в 03:12

Теги

Похожие вопросы