.htaccess headers 被 Apache 忽略所以正在阅读,对吧?.htaccessPHP 提供的标头也加载正常所以这是一个语法错误!.htaccess好的bozo,检查你的错误日志!你试图做些什么来解决这个问题?然后 - 把你的文件拿出来!向我展示魔法!最后,如果您给我上述所有内容的最终摘要,那将非常有帮助!更新:所以看起来我不能为PHP页面设置标题。我该如何解决这个问题?.htaccess

2022-08-31 01:04:48

我有一个网站,它使用与许多其他网站相同的核心细节;但是,这个网站没有正确加载指令 - 给出一个基本的HTTP标头集:.htaccess.htaccess

    HTTP/1.1 200 OK
    Date: Mon, 12 Nov 2018 09:34:28 GMT
    Server: Apache
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=UTF-8

网站本身加载良好,但.htaccess中的附加标头未被确认/加载。

所以正在阅读,对吧?.htaccess

是 -- htaccess 文件包含 HTTPS 强制重定向和域名重定向(从 .co.uk 到 .com 地址(两者都指向同一网站帐户))

这些工作。

PHP 提供的标头也加载正常

测试页面上的PHP标头加载得很好:

<?php
header("Cache-Control: no-cache, must-revalidate");
header('Content-Type: text/html; charset=utf-8');
header("X-Clacks-Overhead: GNU Terry Pratchett");
header("Content-Language: en");
header("X-XSS-Protection: 1; mode=block");
header("X-Frame-Options: SAMEORIGIN");
header("X-Content-Type-Options: nosniff");
?>

但是 中设置的相同标头未得到确认。.htaccess

所以这是一个语法错误!.htaccess

不是我能看到的;通常带有.htaccess错误,站点加载HTTP-500错误消息,但是在这里站点在浏览器中加载没有问题。

存在故意的语法错误时,error-500 HTTP 响应将按预期返回。

好的bozo,检查你的错误日志!

当然可以;我完全同意。Apache 错误日志为空!

你试图做些什么来解决这个问题?

  • 已确认允许读取httpd.conf.htaccess
  • 已确认服务器上加载了 mod_headers.c
  • 注释掉并重新编写了各种规则,没有效果
  • 阅读大量(可能是6-8)关于Stack Overflow和Server Fault的帖子 - Stackoverflow帖子似乎不相关,或者他们的问题有明显的差异。
  • 已确认我的许可证正确 (0644).htaccess
  • 告诉我的员工(他是一名平面设计师)。
  • 哭着自己睡着了。

然后 - 把你的文件拿出来!向我展示魔法!

这里:

Options +FollowSymLinks
Options -Indexes
RewriteEngine On
ErrorDocument 404 /index.php?msg=404
ErrorDocument 403 /index.php?msg=403

#Set asset items to cache for 1 week.
<FilesMatch "\.(gif|jpe?g|png|ico|css|js|swf|mp3)$">
     Header set Cache-Control "max-age=1972800, public, must-revalidate"
</FilesMatch>

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

## This does not appear to work (for either)
#Header always set Strict-Transport-Security "max-age=31536000;" env=HTTPS
Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;" "expr=%{HTTPS} == 'on'"
Header set Expect-CT enforce,max-age=2592000

RewriteCond %{HTTP_HOST} ^(www\.)?thewebsite\.co\.uk$ [NC]
RewriteRule ^/?(.*)$ https://www.thewebsite.com%{REQUEST_URI} [R=301,L]

###
##### Seems to workdown to roughly this point.
###

#force requests to begin with a slash.
RewriteCond  %{REQUEST_URI}  !^$
RewriteCond  %{REQUEST_URI}  !^/
RewriteRule  .*              -    [R=403,L]

RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

### This file does not exist on the directory at present. 
<Files .account-user.ini>
    order allow,deny
    deny from all
</Files>

###
#### None of these appear on assessment tools such as Security Headers 
#### Or redbot.
###
Header set Cache-Control no-cache,must-revalidate
Header set X-Clacks-Overhead "GNU Terry Pratchett"
Header set X-XSS-Protection 1;mode=block
Header set X-Content-Type-Options nosniff
Header always set X-Frame-Options SAMEORIGIN
Header set Expect-CT enforce,max-age=2592000
Header set Content-Language en
Header set Referrer-Policy origin-when-cross-origin
    
<LimitExcept GET POST HEAD>
    deny  from all
</LimitExcept>

最后,如果您给我上述所有内容的最终摘要,那将非常有帮助!

  • 中的标头设置命令似乎不起作用。.htaccess
  • 该文件的所有部分都在其他地方的其他活动网站上使用,没有问题。
  • 头可以在PHP中设置而不会出现问题
  • 中的这些标头不会产生任何错误。.htaccess
  • 标头似乎以静默方式失败。
  • 不会记录任何 Apache 错误日志。
  • Apache 正在读取 ,因为其他命令(如 s)正在.htaccessmod_Rewrite

更新:

从其他方(托管服务提供商)的研究来看,似乎以某种方式工作并加载了非PHP页面的所有正确标头。.htaccess

即使是普通的PHP页面;标头为空。

澄清

  • 无论什么.html页面加载标题都正常。
  • PHP 页面显示由Header("...");
  • PHP 页面拒绝加载 任何由 设置的标头。这就是问题所在。.htaccess

所以看起来我不能为PHP页面设置标题。我该如何解决这个问题?.htaccess


答案 1

PHP在作为FastCGI模块工作时似乎忽略了.htaccess中定义的标头。

有很多建议如何解决这个问题。在你的情况下,我建议有一个定义所有头的文件

<?php
// file headers.php
header('Cache-Control: no-cache,must-revalidate');
header('X-Clacks-Overhead: "GNU Terry Pratchett"');
header('X-XSS-Protection: 1;mode=block');
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: SAMEORIGIN');
header('Expect-CT: enforce,max-age=2592000');
header('Content-Language: en');
header('Referrer-Policy: origin-when-cross-origin');
?>

并将其保存到您的 DocumentRoot 目录中。然后将此条目添加到 .htaccess 文件中,以将其包含在每个请求中:

php_value auto_prepend_file /var/www/html/headers.php     

测试它:

<?php
// file test.php
die("hello world");
?>

并且正在发送标头:

$ curl -I ubuntu-server.lan/test.php
HTTP/1.1 200 OK
Date: Sun, 25 Nov 2018 09:37:52 GMT
Server: Apache/2.4.18 (Ubuntu)
Cache-Control: no-cache,must-revalidate
X-Clacks-Overhead: "GNU Terry Pratchett"
X-XSS-Protection: 1;mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Expect-CT: enforce,max-age=2592000
Content-Language: en
Referrer-Policy: origin-when-cross-origin
Content-Type: text/html; charset=UTF-8

请记住,当您在 .htaccess 中更改标头以同时更改标头时.php。

希望这有帮助!


➥ 上一个答案

我认为这个问题是由于httpd / apache2未正确加载而导致的(尽管您在上述评论之一中另有说明)。您可以通过在终端中执行以下命令来检查这一点:headers_module

apachectl -M | grep headers_module

如果您没有输出(或类似输出),则必须激活httpd / apache2标头模块。在 CentOS 系统上,您必须在配置中加载相应的源文件(默认)。headers_module (shared)/etc/httpd/conf/httpd.conf

您必须添加此行

LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so

然后重新启动 http 服务器sudo systemctl restart httpd.service

在 EasyApache 4 中,httpd/apache2 模块所在的文件夹可能有所不同,并且是 ./usr/lib64/apache2/modules/

我希望这有帮助!


答案 2

与其说是FastCGI,不如说是mod_proxy_fcgi,即要求Apache通过将其传递给其他听众来“执行”FastCGI的方法。

使用任何 mod_proxy* 模块时,根本不会处理 .htaccess,因为您充当代理并短路任何与磁盘相关的配置节。

php-fpm将查看请求URL并从磁盘读取数据,但Apache不是。这只会让人们感到困惑,因为它们可以在同一台主机上运行,并且文件通常位于httpd可以直接服务的目录中。


推荐