我有一个网站使用的核心.htaccess
详细信息与许多其他网站相同;但是,该网站未正确加载.htaccess
指令-提供的基本HTTP标头集为:
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
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错误消息,但是此处该网站会在浏览器中加载而不会出现问题。
当出现 IS 故意的语法错误时,错误500 HTTP响应将按预期返回。
绝对;我完全同意。 Apache错误日志为空!
httpd.conf
允许读取.htaccess
.htaccess
具有正确的权限(0644)这里:
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
中的页眉设置命令似乎无效。 .htaccess
中的这些标题不会引起任何错误。 .htaccess
,因为其他命令(例如mod_Rewrite
) 正在执行根据其他方(托管服务提供商)的研究,看来.htaccess
可以工作并为非PHP页面加载所有正确的标头 。
对于普通的PHP页面;标头为空白。
说明
Header("...");
设置的标题.htaccess
设置的所有标头。这就是问题。 所以看起来我的
.htaccess
无法为PHP页面设置标题。我该如何解决?
答案 0 :(得分:4)
当作为FastCGI模块工作时,PHP似乎会忽略.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中的标头时,也要同时更改headers.php中的标头。
希望这会有所帮助!
我认为此问题是由于httpd / apache2 headers_module
无法正确加载引起的(尽管您在上述注释之一中另有说明)。您可以通过在终端中执行以下命令来进行检查:
apachectl -M | grep headers_module
如果没有输出headers_module (shared)
(或类似输出),则必须激活httpd / apache2标头模块。在CentOS系统上,您必须在配置中加载相应的源文件(默认为/etc/httpd/conf/httpd.conf
)。
您必须添加此行
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
,然后通过sudo systemctl restart httpd.service
使用EasyApache 4时,httpd / apache2模块所在的文件夹可能会不同,并且为/usr/lib64/apache2/modules/
。
我希望这会有所帮助!
答案 1 :(得分:3)
与其说是FastCGI,还不如说是mod_proxy_fcgi,它是一种要求Apache通过将其传递给其他侦听器来“执行” FastCGI的方法。
当您使用任何mod_proxy *模块时,根本不会处理.htaccess,因为您充当代理并将所有与磁盘相关的配置节短路。
php-fpm将查看请求URL并从磁盘读取数据,但Apache不会。这使人们感到困惑,因为它们可以在同一主机上运行,并且文件通常位于httpd可以直接提供服务的目录中。
答案 2 :(得分:1)
经过大量探索,发现问题出在PHP处理程序-fastCGI
(cgi)处理程序未保留标头。
更改为suphp
处理程序可立即解决问题。
答案 3 :(得分:0)
我有同样的问题。
请在Linux Ubuntu中启用cache
模块。
sudo a2enmod cache
然后运行:
sudo service apache2 start
; )! 你喜欢它吗?在网上关注我以获取更多信息。