Можно ли перенаправить данные поста? - PullRequest
50 голосов
/ 11 декабря 2008

У меня есть веб-сайт, на котором все запросы перенаправляются молча (через .htaccess) на index.php, а затем PHP используется для отображения правильной страницы (путем анализа REQUEST_URI).

Мне было интересно, можно ли отправлять POST-данные на поддельный адрес?

У меня сейчас такая форма ...

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

И мое .htaccess правило ...

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

Мой index.php проверяет isset($_GET['send-mail']), который отлично работает.

Однако, похоже, это отбрасывает все данные POST, которые должны быть отправлены на него.

Есть ли способ сохранить почтовые данные? Я не хочу использовать GET, потому что он не может отправить столько информации, хотя это может быть не проблема с простой формой запроса.

Вот мой .htaccess для перенаправления на 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

Ответы [ 5 ]

60 голосов
/ 11 декабря 2008

Попробуйте это:

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

«P» действует как «L» в том смысле, что останавливает обработку правил, но также сообщает модулю, что запрос должен быть передан в прокси-модуль без изменений (то есть данные POST сохраняются).

7 голосов
/ 11 декабря 2008

Вы должны иметь возможность просто перенаправить на index.php, а затем в этом сценарии получить доступ к $_SERVER['REQUEST_URI'], чтобы увидеть исходный запрос, с "send-mail" без изменений.

Кстати, «не могу отправить столько информации» не является причиной для использования POST. Причиной использования POST является то, что запрос будет изменять данные на вашем сайте, а не просто получать данные.

Предположим, вы разместили на своей странице гиперссылку с запросом GET, например "/delete_user?id=1234", а затем какая-то поисковая система невинно переходит по ссылке, когда она индексирует ваш сайт. Вот почему запросы GET не подходят для запросов, которые изменяют данные.

1 голос
/ 05 декабря 2016

Чтобы избежать проблем с некоторыми прокси и перезаписью Apache, передайте данные POST или установите заголовок Content-Length: 0 для запросов с пустым телом.

У меня недавно были проблемы с преобразованием Apache моего запроса в GET при выполнении POST с пустым телом. Итак, вместо этого:

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

передать заголовок Content-Length:

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

или передать что-то в теле:

 curl -X POST https://example.com/api/user/123456789 -d ''
0 голосов
/ 27 февраля 2015

Я хочу перенаправить user_login.php на SEO дружественный URL-адрес, такой как / user-login, с данными формы сообщения, и это сработало для меня.

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]

В файле просмотра

<form action="<?php $siteurl;?>/user-login" method="post" id="user_login">
0 голосов
/ 11 декабря 2008

Пока вы используете только внутреннюю перезапись, а не HTTP-перенаправление, вы не должны терять данные POST. Вот правило, которое я использую на своем сайте:

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

Попробуйте использовать расширение HTTPLiveHeaders для Firefox (или чего-то подобного) и отследить весь запрос страницы. Убедитесь, что вы не получаете перенаправление HTTP. Если вы получили ответ HTTP / 1.1 3xx и Location: http://address header, это проблема. Ваше правило переписывания, которое вы опубликовали, не должно приводить к этому. Если вы перенаправлены, возможно, в вашем PHP-коде произошла ошибка или применено другое правило перезаписи.

...