【问题标题】:URL rewriting and Javascript HTTP requestsURL 重写和 Javascript HTTP 请求
【发布时间】:2014-11-19 03:08:25
【问题描述】:

打开 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_check.php?lang="+langSelect, true);GET 方法仍然像以前一样正常工作。

RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^ - [L]

在我的 .htaccess 文件中添加此代码后,POST 方法开始正常工作。

我有点困惑,因为 GET 方法在打开 url 重写后工作正常,但 POST 方法没有。 xmlhttp GET 是否可以正常工作而无需在 .htaccess 文件中添加一些行但 POST 方法不能?我想有人解释一下为什么 GET 方法在 url 重写(删除 .php 扩展名)后起作用,但 POST 方法不起作用。

提前致谢。

【问题讨论】:

    标签: javascript php .htaccess xmlhttprequest


    【解决方案1】:

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

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

    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]
    

    【讨论】:

    • @kizzwiz 在 GET 请求中,数据是查询字符串形式的实际 URL 的一部分(例如 ?param=value&param2=value2 东西),但在 POST 请求中,这些参数被编码为一部分请求的正文(在 URL 中看不到)。见:stackoverflow.com/questions/14551194/…
    【解决方案2】:

    POST 请求会发生以下情况:

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

    【讨论】:

    • 谢谢,但是为什么即使服务器执行从 php/language_check.php?lang=php/language_check/?lang= 的 301 重定向,GET 方法仍然有效?
    • GET 请求有效,因为所有参数都是 URL 本身的一部分。
    • 我明白了。非常感谢!
    猜你喜欢
    • 2014-01-20
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多