Можно ли перенаправить данные поста?
У меня есть веб-сайт, где все запросы перенаправляются без уведомления (через .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
6 ответов
Попробуй это:
# redirect mail posting to index
RewriteRule send-mail index.php?send-mail [NC,P]
"P" действует как "L" в том смысле, что останавливает обработку правил, но также сообщает модулю, что запрос должен быть передан прокси-модулю без изменений (то есть данные POST сохраняются).
Вы должны иметь возможность просто перенаправить на index.php
, а затем в этом скрипте, доступ $_SERVER['REQUEST_URI']
чтобы увидеть исходный запрос, с "send-mail" нетронутым.
Кстати, "не могу отправить столько информации" не является причиной для использования POST. Причиной использования POST является то, что запрос будет изменять данные на вашем сайте, а не просто получать данные.
Предположим, вы разместили на своей странице гиперссылку с GET-запросом, например "/delete_user?id=1234
", а затем какая-то поисковая система невинно переходит по ссылке, так как она индексирует ваш сайт. Вот почему запросы GET не годятся для запросов, которые изменяют данные.
Я нашел самый надежный способ - использовать
307
код состояния.
RewriteRule send-mail index.php?send-mail [R=307,L]
Код состояния 307 указывает, что запрос следует повторить с тем же методом и данными HTTP. Таким образом, ваш запрос будет повторяться вместе с его данными, если вы используете этот код состояния.
Вы также можете определить, является ли запрос запросом, если вам нужно поддерживать стандартные
301
перенаправления для не
POST
Запросы.
# POST requests.
RewriteCond %{REQUEST_METHOD} POST
RewriteRule send-mail index.php?send-mail [R=307,L]
# Standard GET requests.
RewriteRule send-mail index.php?send-mail [R=301,L]
Я хочу перенаправить 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">
Чтобы избежать проблем с некоторыми прокси и перезаписью 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 ''
Пока вы используете только внутреннюю перезапись, а не перенаправление HTTP, вы не должны терять данные POST. Вот правило, которое я использую на своем сайте:
RewriteRule ^(.*)$ index.php/$1 [L]
Попробуйте использовать расширение HTTPLiveHeaders для Firefox (или что-то подобное) и отследите весь запрос страницы. Убедитесь, что вы не получаете перенаправление HTTP. Если вы получите ответ HTTP/1.1 3xx и Адрес: http://address/ header, это проблема. Ваше правило переписывания, которое вы опубликовали, не должно приводить к этому. Если вы перенаправлены, возможно, в вашем PHP-коде произошла ошибка или применено другое правило перезаписи.