Apache Mod_Rewrite - перенаправление с потерей данных POST - ошибка 405

пользователи стековерфлоу,

У меня есть приложение Apache, которое должно принимать данные, отправленные по следующим путям:

/sample/HostChange/Submit
/sample/HostChange/SubmittoAPI

В настоящее время я использую следующие правила перенаправления 301. Это не то, что я хочу, так как POST перенаправляется, а второй запрос - это GET, теряющий все данные. Я вижу, что запрос 301 идет по правильному URL-адресу, но второй запрос является GET и вызывает код ответа 405.

.htaccess:

RewriteEngine On
Redirect 301 /sample/HostChange/Submit /event
Redirect 301 /sample/HostChange/SubmittoAPI /date

Я уверен, что проблема заключается в использовании перенаправления. Может ли кто-нибудь помочь мне определить правильный RewriteCondition, который мне нужно использовать для перенаправления этих обращений POST на новые пути, но сохранить данные, отправляемые в приложение.

Большое спасибо.


person god    schedule 21.12.2012    source источник
comment
¿Вы пробовали использовать mod-rewrite? Причина, по которой я спрашиваю, заключается в директиве Redirect (httpd.apache.org/docs/2.2/mod/mod_alias.html) "The old URL-path is a case-sensitive (%-decoded) path...", и это может быть изменение POST, что, в свою очередь, может повлиять на следующий GET. Просто идея, но если это так, вам следует попробовать вместо этого использовать mod-rewrite.   -  person Felipe Alameda A    schedule 21.12.2012
comment
Если я что-то не упустил, вы используете Redirect, который является mod-alias директива. Я имел в виду RewriteRule, который является директивой mod-rewrite.   -  person Felipe Alameda A    schedule 21.12.2012
comment
О, да. Моя ошибка. Мне нужно использовать mod_redirect для выполнения этой работы. Есть ли у вас какие-либо рекомендации по RewriteCond/Rule?   -  person god    schedule 21.12.2012
comment
См. stackoverflow.com/questions/10586779/   -  person Gerben    schedule 22.12.2012


Ответы (3)


Я не думаю, что вы можете перенаправить POST (как POST). Браузеры просто не будут размещать данные снова.

Вам нужно будет вывести некоторый HTML с Javascript, чтобы браузер повторно отправил данные на новый URL-адрес.

Или вместо перенаправления сделайте так, чтобы какой-нибудь серверный код сначала принимал данные POST, а затем каким-то образом отправлял их (возможно, перенаправляя с помощью идентифицирующего токена в URL-адресе) внутренне.

Или, если данные короткие, перепишите URL-адрес, чтобы включить данные в качестве параметров запроса.

person Thilo    schedule 21.12.2012
comment
См. также этот вопрос для ответа о попытке использовать перенаправление 303: stackoverflow .com/questions/7574068/about-redirect-as-post - person Thilo; 21.12.2012
comment
Я думаю, что это должно быть 307, а не 303. - person Gerben; 22.12.2012

Что-то вроде следующего должно работать, в данный момент я не работаю с экземпляром apache, поэтому регулярное выражение не пробовалось, но, пожалуйста, проверьте журнал перезаписи и посмотрите, как оно себя ведет.

RewriteEngine On
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 9
RewriteCond %{REQUEST_URI} /sample/HostChange/Submit
RewriteRule ^/sample/HostChange/Submit(.*) /event/$1 [P,L]
person opensourcegeek    schedule 21.12.2012
comment
Не могли бы вы показать, что пишет apache, чтобы переписать журнал для одного запроса к /sample/HostChange/Submit? Как я уже сказал, я не проверял регулярное выражение, но приведенная выше структура сохранит вашу полезную нагрузку, если таковая имеется, а также параметры запроса, если таковые имеются, в запросе к исходному URL-адресу. Я использую что-то подобное в производстве для перенаправления запроса на zope или jboss в зависимости от шаблона URL. - person opensourcegeek; 22.12.2012

У меня какая-то такая же проблема, мне помогло не то чтобы действительно перенаправить запрос, а переписать его. Я не сейчас, если это применимо к вашей проблеме.

Вот подробности, и это сработало для меня: PHP Переписать URL-адрес и сохранить опубликованные данные< /а>

person Seb    schedule 16.01.2014