Я использую 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
Первый RewriteRule
внутренне переписывает запрос (все еще на вашем сервере):
/redirect/forms%2Fd%2Fe%2F1234567890%2Fviewform
Это "разрешено" (и не вызывает 404) из-за AllowEncodedSlashes On
директива, которую вы установили в конфигурации сервера.
Затем второй RewriteRule
расшифровывает URL-путь (%2F
к /
) и выдает внешнее перенаправление на:
https://docs.google.com/forms/d/e/1234567890/viewform
Apache автоматически декодирует URL-адрес URL-пути перед RewriteRule
шаблон применяется. Соответствующая часть захватывается и передается в замена в $1
обратная ссылка.