Можно ли перенаправить данные поста?

У меня есть веб-сайт, где все запросы перенаправляются молча (через .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
11.12.2008 02:10:07
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

63
11.12.2008 02:57:41
Обратите внимание, что вам нужно включить модуль прокси и модуль proxy_http_module в файлах конфигурации, чтобы это работало. Также вам может понадобиться установить абсолютный путь к правилу перезаписи. То есть в приведенном выше примере вы бы использовали RewriteRule send-mail /path/to/index/index.php?send-mail [NC,P](или, по крайней мере, /индекс до)
Marius 29.01.2010 14:31:02
Если вы хотите, чтобы заголовок хоста был сохранен, вы также должны включить его ProxyPreserveHost Onв конфигурации Apache.
Artem Russakovskii 12.08.2012 05:15:04
Похоже, что в то же время проксирование также работает для URL, как указано в документации: httpd.apache.org/docs/2.4/rewrite/proxy.html
Kjell 23.04.2017 13:49:01

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

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

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

0
11.12.2008 02:59:59
Нет, я возвращаюсь 200 OK: S
alex 11.12.2008 04:11:20
похоже, что браузер будет использовать GETдля второго запроса после перенаправления ...
Janus Troelsen 12.10.2014 16:28:28
Нет второго запроса с переписыванием. Только перенаправление (заголовок местоположения и ответ 3xx) имеет второй запрос.
mcrumley 12.10.2014 16:38:05

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

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

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

9
11.12.2008 03:04:45
Есть небольшое ограничение в том, что, как только вы достигнете некоторого произвольного предела (я думаю, что это 1024 символа), данные, следующие за ним, будут удалены из запроса. Особенно проблематично, если это поле ввода пользователя.
Kent Fredric 11.12.2008 06:24:52
(NB: Limit зависит от сервера и браузера, RFC говорит, что он неограничен, но мы знаем, как часто некоторые компании читают это)
Kent Fredric 11.12.2008 06:28:42
+1 Я немного более просветленным , так как я задал этот вопрос , и теперь в полной мере понять все изменения данных должны быть POST
alex 14.08.2009 01:57:50

Я хочу перенаправить 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
27.02.2015 13:13:56

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

Недавно у меня возникли проблемы с преобразованием Apache моего запроса в a 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 ''
1
4.12.2016 23:42:01