【问题标题】:apache RewriteRule is sending requests twiceapache RewriteRule 发送请求两次
【发布时间】:2017-02-11 11:06:57
【问题描述】:

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

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

这个规则的问题是它两次发送所有的ajax请求,第一个请求状态是307,下一个在某些浏览器中被取消。就像下面的 ajaxRequests 截图一样:

请帮助我了解重写规则中出了什么问题。提前致谢。

【问题讨论】:

  • 嗯,显然你有两个请求:第一个命中你的重写规则,得到响应的 http 状态为 307,下一个命中你重写的 URL。
  • 好的,下一个请求被取消的原因是什么,这在 chrome 和 mozilla 中运行良好,问题出在 safari 中。
  • 我怎样才能避免发送 2 个请求?
  • 您不能使用该设置,除非客户端已经知道最终 URL 并直接请求而不依赖重定向。
  • 好吧,显然你可以使用内部代理模块进行internal重写,这样客户端就不需要做任何事情了。

标签: php apache mod-rewrite url-rewriting


【解决方案1】:

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

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”)。众所周知,这些文件容易出错,难以调试,而且它们确实会降低服务器的速度。它们仅在您无法控制主机配置的情况下(阅读:非常便宜的托管服务提供商)或如果您的应用程序依赖于编写自己的重写规则(这是一个明显的安全噩梦)提供它们作为最后一个选项)。

【讨论】:

    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    相关资源
    最近更新 更多