2 votes

Décoder une URL réécrite en utilisant mod_rewrite - htaccess - regex

Je utilise Apache 2.4. J'ai configuré un serveur HTTP Apache pour héberger mon application Invision, mon application est liée à des documents externes sur Google. J'essaie de rediriger vers un document Google externe à partir de l'application mais Apache n'aime pas cela.

Voici l'URL qu'il essaie d'accéder

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

J'ai réécrit l'URL en utilisant ce qui suit:

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

et après la réécriture, j'obtiens ceci.

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

Cela fait ce qu'il est censé faire et si je remplace personnellement le %2F par '/' cela m'amène au document donc je sais que c'est proche. L'URL redirige vers Google Drive, seulement j'obtiens une

page 404 non trouvée

message de Google Drive. Je sais que je dois décoder l'URL pour atteindre le document avec succès mais comment puis-je le faire en utilisant .htaccess ou tout autre moyen?

AllowEncodedSlahes on (J'ai également essayé NoDecode) //conf VirtualHost et conf Apache

J'ai essayé de faire correspondre et remplacer les %2F en utilisant Regex mais ils ne sont pas reconnus et j'obtiens une erreur 500 - Erreur interne du serveur.

Je comprends que cela semble être un bogue/problème continu mais est-ce que quelqu'un a une solution à ce problème incroyablement douloureux s'il vous plaît? Je suis à bout avec cela, Merci.

2 votes

Pouvez-vous s'il vous plaît inclure l'URL demandée que vous essayez de trouver.

0 votes

@MrWhite J'ai modifié ma question pour inclure l'URL demandée que je suis en train de faire correspondre

1voto

MrWhite Points 11269

et après la réécriture, il me reste ceci.

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

Bien que cela ne se produirait pas avec les directives que vous avez postées, à moins que vous n'incluez également le drapeau NE (noescape) sur la directive RewriteRule. (Au lieu de cela, il serait doublement encodé). Utiliser le drapeau NE est un pas dans la bonne direction, cependant, nous avons besoin d'une autre étape pour décoder l'URL-path résultant...

Note latérale: L'URL-path résultant que vous avez posté ci-dessus contient une faute de frappe (vu votre URL d'entrée d'exemple). Le dernier %2F manque; à la place, vous avez 0%F. Il devrait être écrit: forms%2Fd%2Fe%2F1234567890%2Fviewform

Google semble déclencher l'erreur 404 à cause des slashs encodés dans l'URL-path (comme vous le suggérez), tout comme le fera Apache par défaut. Définir AllowEncodedSlashes On (dans le vHost) n'aidera pas immédiatement avec cela car la 404 est déclenchée par Google. Cependant, cela doit être configuré pour que nous puissions traiter l'URL plus avant et décoder les slashs encodés, avant d'émettre la redirection finale.

Essayez plutôt ce qui suit:

# Définissez dans votre vhost (configuration serveur)
AllowEncodedSlashes On

Ensuite, dans .htaccess (ou la section appropriée):

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

Ainsi, étant donné une demande initiale à votre serveur de:

/redirect?url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1234567890%2Fviewform
  1. Le premier RewriteRule réécrit en interne la demande à (toujours sur votre serveur):

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

    Cela est "autorisé" (et ne déclenche pas de 404) en raison de la directive AllowEncodedSlashes On que vous avez définie dans la configuration du serveur.

  2. Ensuite, le deuxième RewriteRule décode l'URL-path (%2F en /) et émet une redirection externe vers:

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

    Apache décoder automatiquement l'URL-path avant que le RewriteRule pattern soit appliqué. La partie pertinente est capturée et transmise à la substitution dans le rétro-référence $1.

1 votes

Si je pouvais UpVote cela 1000 fois, je le ferais. Solution parfaite qui fonctionne exactement comme je le voulais. De plus, grâce à votre réponse détaillée, je comprends exactement ce qui se passe à chaque étape et pourquoi cela se produit. Excellent. Merci beaucoup.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X