【问题标题】:Apache won't set headers for PHP scriptApache 不会为 PHP 脚本设置标头
【发布时间】:2015-11-15 19:36:54
【问题描述】:

这个.htaccess 文件:

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 4 month"
</IfModule>
<IfModule mod_headers.c>
    Header merge X-ModHeaders "Yes, it is installed"
</IfModule>

... 在我的开发框(Windows 框,Apache/2.4.10,作为 Apache 模块运行的 PHP)中按预期工作,其中“工作”意味着它为所有资源(静态或动态)生成适当的标头。

但是,在我的生产服务器(Linux 机器,Apache/2.2.31,PHP 作为 FastCGI 和 mod_fcgid/2.3.9 运行)中,它仅适用于静态资产,不适用于 PHP 脚本。

我是否正确怀疑差异来自 PHP SAPI?有没有办法修复它,所以我不需要复制生成 HTTP 标头的代码?

【问题讨论】:

  • PHP 可以编辑标题,但这并不意味着默认情况下会。无论如何,您仍然应该得到这些
  • 认为这里的答案适用:serverfault.com/questions/383011/… ... 没有深入研究,但阅读了它引用的那些错误报告。
  • 您的生产设备是否使用共享主机?这可能会阻止您更改某些 apache 模块...
  • @ficuscr 这当然是我的问题,但到目前为止唯一的答案声称它不是一个错误并链接了一张谈论其他事情的票。哎呀..
  • @LucLaverdure - 是的,它是共享主机。如果它是专用服务器,我究竟能改变什么?

标签: php apache mod-expires mod-fcgid mod-headers


【解决方案1】:

如果 PHP 通过 mod_proxy_fcgi 运行,则可能不涉及文件系统目录,因此不会发生 htaccess 查找。

现在在手册中记录了一种更新的 php+mod_proxy_fcgi 风格,它使用 SetHandler 而不是 ProxyPass——它允许处理 htaccess 之类的东西,因为核心实际上在文件系统中查找 URL 作为第一步。

【讨论】:

  • 服务器正在使用“mod_fcgid/2.3.9”并且.htaccess肯定会执行,因为其他模块按预期工作(例如mod_rewriteAddHandler指令来选择PHP版本)并且无效指令导致状态 500 响应。
  • 顺便说一句,我已经用我正在使用的实际 CGI 处理程序更新了这个问题(不是 mod_fastcgi 而是 mod_fcgid,我的错)
  • 对我来说这就是原因:我切换到共享主机上的 PHP 模块,然后 Header set 工作了。
  • 我最终得到了 HSP 支持的确认,而不是他们的 mod_fcgid 设置阻止了 .htaccess 中设置的自定义标头工作。 (我非常抱歉当时没有报告!)
  • @AdrianFöder 据我所知,他们没有解决任何问题。我的托管服务提供商的特定设置不允许这些指令影响他们处理的文件。但由于该问题仅影响 PHP 文件,因此使用 header() 编写 PHP 解决方法很简单。
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 2011-05-20
  • 1970-01-01
  • 2012-05-15
  • 2023-03-27
  • 2015-07-29
  • 2015-05-29
相关资源
最近更新 更多