web-dev-qa-db-fra.com

Est-il possible de rediriger les données de publication?

J'ai un site Web où toutes les demandes sont redirigées silencieusement (via .htaccess) vers index.php et ensuite PHP est utilisé pour afficher la page correcte (en analysant le REQUEST_URI).

Je me demandais s'il était possible de soumettre POST des données à une fausse adresse également?

J'ai actuellement ma forme comme si ...

<form action="/send-mail" method="post">

Et ma règle .htaccess est ...

# redirect mail posting to index
RewriteRule send-mail index.php?send-mail [NC,L] 

Mon index.php vérifie isset($_GET['send-mail']) qui fonctionne bien.

Cela semble toutefois supprimer toutes les données POST qui devraient lui être envoyées.

Existe-t-il un moyen de conserver les données de publication? Je ne souhaite pas utiliser GET car il ne peut pas envoyer autant d'informations, bien que le problème ne se pose peut-être pas avec un simple formulaire d'enquête.

Voici mon .htaccess pour la redirection vers index.php

# serve files and dirs if they exist please, otherwise send to index
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php
50
alex

Essaye ça:

# redirect mail posting to index
     RewriteRule send-mail index.php?send-mail [NC,P]

"P" agit comme "L" dans la mesure où il arrête le traitement des règles, mais indique également au module que la requête doit être transmise au module mandataire intact (ce qui signifie que POST est préservée).

60
Tautologistics

Vous devriez être capable de rediriger simplement vers index.php, puis dans ce script, accédez à $_SERVER['REQUEST_URI'] pour voir la demande initiale, avec "send-mail" intact.

À propos, "ne peut pas envoyer autant d'informations" n'est pas la raison d'utiliser POST. La raison d'utiliser POST est que la requête modifiera les données de votre site, au lieu de simplement les récupérer. 

Supposons que vous placiez un lien hypertexte sur votre page avec une requête GET du type "/delete_user?id=1234", puis qu'un moteur de recherche suit innocemment le lien car il indexe votre site. C'est pourquoi les requêtes GET ne conviennent pas aux requêtes qui modifient des données.

7
Bill Karwin

Tant que vous utilisez uniquement une réécriture interne, et non une redirection HTTP, vous ne devez pas perdre de données POST. Voici la règle que j'utilise sur mon site:

RewriteRule ^(.*)$ index.php/$1 [L]

Essayez d'utiliser l'extension HTTPLiveHeaders pour Firefox (ou quelque chose de similaire) et suivez la demande de page entière. Assurez-vous de ne pas recevoir de redirection HTTP. Si vous obtenez une réponse HTTP/1.1 3xx et un en-tête Location: http: // adresse, c'est le problème qui se pose. Votre règle de réécriture que vous avez publiée ne devrait pas en être la cause. Si vous êtes redirigé, il y a probablement une erreur dans votre code PHP ou une autre règle de réécriture en cours d'application.

1
mcrumley

Pour éviter les problèmes liés à certains mandataires et aux réécritures Apache, transmettez des données POST ou définissez l'en-tête Content-Length: 0 pour les demandes avec un corps vide.

Apache a récemment eu des problèmes avec la conversion de ma demande en une GET lorsque je faisais une POST avec un corps vide. Donc, au lieu de cela:

 curl -X POST https://example.com/api/user/123456789

passez l'en-tête Content-Length:

 curl -X POST https://example.com/api/user/123456789 -H 'Content-Length: 0'

ou passer quelque chose dans le corps:

 curl -X POST https://example.com/api/user/123456789 -d ''
1
Alex Pop

Je veux rediriger user_login.php vers une URL conviviale comme/user-login avec les données de formulaire et cela a fonctionné pour moi.

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/user_login\.php [NC]
RewriteRule ^ user-login [QSA,R=301]
RewriteRule ^user-login$ user_login.php [QSA,L]

Dans le fichier de vue 

<form action="<?php $siteurl;?>/user-login" method="post" id="user_login">
0
Kamal Kumar