Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
URL重写和Javascript HTTP请求_Javascript_Php_.htaccess_Xmlhttprequest - Fatal编程技术网

URL重写和Javascript HTTP请求

URL重写和Javascript HTTP请求,javascript,php,.htaccess,xmlhttprequest,Javascript,Php,.htaccess,Xmlhttprequest,在打开URL重写之后,我遇到了一个关于Javascript HTTP请求的问题 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L] RewriteCond %{THE_REQUEST} \ /(.+)\.php(\?|\ |$) RewriteRule ^ /%1 [L,R=301] xmlhttp.open(“POST”,“php/msg_send.php”,tru

在打开URL重写之后,我遇到了一个关于Javascript HTTP请求的问题

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteCond %{THE_REQUEST} \ /(.+)\.php(\?|\ |$)
RewriteRule ^ /%1 [L,R=301]
xmlhttp.open(“POST”,“php/msg_send.php”,true)
POST方法根本不起作用,但是
xmlhttp.open(“GET”,“php/language\u check.php?lang=“+langSelect,true”)获取方法继续像以前一样正常工作

RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^ - [L]
在我的.htaccess文件中添加此代码后,POST方法开始正常工作

我有点困惑,因为GET方法在启用url重写后运行良好,但POST方法并没有。xmlhttp GET不需要在.htaccess文件中添加一些行就可以正常工作,但POST方法不能吗?我想有人解释一下为什么在url重写(删除.php扩展名)之后GET方法可以工作,而POST方法不能


提前感谢。

原因是您正在重定向
R=301
,当您重定向POST请求时,POST数据所在的请求正文不能保证与重定向一起发送。如果您使用javascript发送帖子,并且浏览器的URL位置栏没有改变,那么您根本不需要重写任何帖子请求(因为我猜规则的目标是从URL中删除“php”扩展)

您可以通过添加更多内容来清理规则:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{THE_REQUEST} \ /(.+)\.php(\?|\ |$)
RewriteRule ^ /%1 [L,R=301]

以下是
POST
请求发生的情况:

  • 浏览器将POST请求发送到服务器的URL:
    http://domain.com/php/msg_send.php
  • 服务器执行301重定向到
    http://domain.com/php/msg_send
  • 在重定向时,POST数据被丢弃,因为客户端将对URL执行GET请求
    http://domain.com/php/msg_send
    由301接收

  • 谢谢,但是为什么GET方法可以工作呢?即使服务器从
    php/language\u check.php?lang=
    重定向到
    php/language\u check/?lang=
    ?GET请求可以工作,因为所有参数都是URL本身的一部分。我明白了。多谢各位@kizzwiz在GET请求中,数据是查询字符串形式的实际URL的一部分(例如,
    ?param=value¶m2=value2
    stuff),但在POST请求中,这些参数被编码为请求正文的一部分(在URL中看不到)。见: