62 votes

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

J'ai un site web où toutes les requêtes sont redirigées silencieusement (via .htaccess) vers index.php puis PHP est utilisé pour afficher la page correcte (en analysant le REQUEST_URI).

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

J'ai actuellement mon formulaire comme ceci...

Et ma règle de .htaccess est...

# rediriger l'envoi de mail vers l'index
RewriteRule envoyer-mail index.php?send-mail [NC,L] 

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

Cependant, cela semble supprimer toutes les données POST qui devraient lui être envoyées.

Y a-t-il un moyen de conserver les données post? Je ne veux pas utiliser GET car il ne peut pas envoyer autant d'informations, bien que cela ne soit peut-être pas un problème avec un simple formulaire de demande.

Voici mon .htaccess pour la redirection vers index.php

# servir les fichiers et les répertoires s'ils existent, sinon envoyer à l'index
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php

70voto

Tautologistics Points 793

Essayez ceci:

# rediriger l'envoi de courrier vers l'index
RewriteRule send-mail index.php?send-mail [NC,P]

"P" agit comme "L" en ce sens qu'il arrête le traitement des règles mais informe également au module que la requête doit être transmise au module proxy intact (ce qui signifie que les données POST sont préservées).

16 votes

Notez que vous devez activer le module proxy et le module proxy_http dans les fichiers de configuration pour que cela fonctionne. De plus, vous pourriez avoir besoin de définir le chemin absolu de la règle de réécriture. C'est-à-dire, dans l'exemple ci-dessus, vous utiliseriez RewriteRule send-mail /chemin/vers/index/index.php?send-mail [NC,P] (ou au moins un / avant index)

2 votes

Si vous voulez que l'en-tête Host soit préservé, vous voudrez également activer ProxyPreserveHost On dans la configuration d'Apache.

0 votes

Il semble que dans l'intervalle, la mise en place de proxy fonctionne également pour les URL comme indiqué dans la documentation : httpd.apache.org/docs/2.4/rewrite/proxy.html

9voto

Bill Karwin Points 204877

Vous devriez simplement pouvoir rediriger vers index.php, puis dans ce script, accéder à $_SERVER['REQUEST_URI'] pour voir la requête d'origine, avec "send-mail" intacte.

Soit dit en passant, "ne peut pas envoyer autant d'informations" n'est pas une raison pour utiliser POST. La raison d'utiliser POST est que la requête modifiera des données sur votre site, au lieu de simplement récupérer des données.

Supposez que vous mettiez un hyperlien sur votre page avec une requête GET comme "/delete_user?id=1234," et ensuite un moteur de recherche suit innocemment le lien pendant qu'il indexe votre site. C'est pourquoi les requêtes GET ne sont pas bonnes pour les requêtes qui modifient les données.

3 votes

Il y a une petite limitation à cela, une fois que vous atteignez une limite arbitraire (je pense que c'est 1024 caractères), les données qui suivent sont supprimées de la demande. Surtout problématique si cela se produit dans un champ de saisie utilisateur.

3 votes

(NB: La limite est spécifique au serveur et au navigateur, la RFC dit qu'elle est illimitée, mais nous savons à quelle fréquence certaines entreprises le lisent)

3 votes

+1 Je suis un peu plus éclairé depuis que j'ai posé cette question et maintenant je comprends parfaitement que toute modification de données doit être faite en POST

8voto

Mat Lipe Points 174

J'ai trouvé que le moyen le plus fiable est d'utiliser le code d'état 307.

RewriteRule send-mail index.php?send-mail [R=307,L]

Le code d'état 307 indique que la requête devrait être répétée avec la même méthode HTTP et les mêmes données. Ainsi, votre requête POST sera répétée avec ses données si vous utilisez ce code d'état.

Vous pouvez également détecter si la requête est une requête POST au cas où vous auriez besoin de supporter des redirections 301 standard pour les requêtes non POST.

# Requêtes POST.
RewriteCond %{REQUEST_METHOD} POST
RewriteRule send-mail index.php?send-mail [R=307,L]

# Requêtes GET standard.
RewriteRule send-mail index.php?send-mail [R=301,L]

1voto

Kamal Kumar Points 1369

Je veux rediriger user_login.php vers une URL conviviale pour le référencement comme /user-login avec les données du formulaire POST 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

1voto

Alex Pop Points 149

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

Récemment, j'ai eu des problèmes avec Apache qui convertissait ma demande en GET lors d'un POST avec un corps vide. Ainsi, au lieu de cela :

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

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

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

ou transmettez quelque chose dans le corps :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X