Я использую 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
- это шаг в правильном направлении, однако нам нужен еще один шаг для декодирования 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
Первое 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
.