Назад | Перейти на главную страницу

Расшифровка переписанного 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 - Внутренняя ошибка сервера.

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

и после переписывания я остался с этим.

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

Хотя этого не произойдет с опубликованными вами директивами, если вы также не включили NE (noescape) флаг на RewriteRule директива. (Вместо этого было бы дважды закодированный). Используя NE flag - это шаг в правильном направлении, однако нам нужен еще один шаг, чтобы 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 (или соответствующий <Directory> раздел):

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 обратная ссылка.