У меня есть сайт, на котором все запросы перенаправляются молча (через .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
Попробуй это:
# 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 не подходят для запросов, которые изменяют данные.
До тех пор, пока вы используете только внутреннюю переписку, а не перенаправление HTTP, вы не должны терять POST-данные. Вот правило, которое я использую на своем сайте:
RewriteRule ^(.*)$ index.php/$1 [L]
Попробуйте использовать расширение HTTPLiveHeaders для Firefox (или что-то подобное) и отслеживать весь запрос страницы. Убедитесь, что вы не получаете перенаправление HTTP. Если вы получаете ответ HTTP / 1.1 3xx и адрес Location: http: // address , это проблема. Правило перезаписи, которое вы опубликовали, не должно вызывать этого. Если вы перенаправлены, вероятно, есть либо ошибка в вашем PHP-коде, либо другое правило перезаписи, которое применяется.
Чтобы избежать проблем с некоторыми прокси-серверами и перезаписыванием 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 ''
Я хочу перенаправить user_login.php на seo дружественный URL-адрес, например / user-login, с данными формы сообщения, и это сработало для меня.
RewriteCond %{THE_REQUEST} ^[AZ]{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">