apache RewriteRule发送请求两次

时间:2017-02-11 11:06:58

标签: php apache mod-rewrite url-rewriting

我正在尝试使用以下apache重写规则更改PHP文件的URL

RewriteEngine On RewriteCond %{REQUEST_FILENAME} \.(php)$ RewriteRule ^/(.*)$ http://localhost.weebsy1.com:90/$1 [R=307,L]

此规则的问题在于它发送所有ajax请求两次,第一个请求状态为307,而下一个请求在某些浏览器中被取消。如下面的ajaxRequests截图:

enter image description here

请帮助我了解重写规则中出错的原因。提前谢谢。

1 个答案:

答案 0 :(得分:0)

如评论中所述,您可以将服务器内部重写与服务器端代理模块结合使用,以防止发送两个请求:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} \.(php)$
RewriteRule ^/?(.*)$ http://example.com:90/$1 [P,END]

如果您使用的是非常旧版本的apache http服务器,则可能必须使用END标志替换L标志。

为了实现上述目标,必须满足一些先决条件:

  • 必须启用重写模块,显然
  • 必须启用代理模块

上述规则同样适用于.htaccess样式动态配置文件中的主机配置部分

另一种方法是使用代理模块:

<LocationMatch ^/(.*\.php)$>
    ProxyRequests off
    ProxyPass / http://example.com:90/
    ProxyPassReverse  / http://example.com:90/ 
</LocationMatch>

此方法仅适用于动态配置文件中的http服务器主机配置,

一般提示:您应该始终更喜欢将此类规则放在http服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些文件非常容易出错,难以调试,它们确实会降低服务器的速度。它们仅作为最后一个选项提供给您无法控制主机配置的情况(阅读:非常便宜的托管服务提供商),或者您有一个依赖于编写自己的重写规则的应用程序(这是一个明显的安全噩梦) )。