# Apache/PHP/Drupal 设置:
#
# 保护文件和目录不被窥视。
<FilesMatch "\.(engine|inc|install|make|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\.(?!well-known).*|Entries.*|Repository|Root|Tag|Template|composer\.(json|lock)|web\.config|yarn\.lock|package\.json)$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig|\.save)$">
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order allow,deny
</IfModule>
</FilesMatch>
# 不显示映射到目录的URL的目录列表。
Options -Indexes
# 设置默认处理程序。
DirectoryIndex index.php index.html index.htm
# 为SVGZ添加正确的编码。
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
# 以下大多数PHP设置无法在运行时更改。请参阅
# sites/default/default.settings.php 和
# Drupal\Core\DrupalKernel::bootEnvironment() 了解可以在运行时更改的设置。
# PHP 7,Apache 1 和 2。
<IfModule mod_php7.c>
php_value assert.active 0
</IfModule>
# PHP 8,Apache 1 和 2。
<IfModule mod_php.c>
php_value assert.active 0
</IfModule>
# 需要启用mod_expires。
<IfModule mod_expires.c>
# 启用到期。
ExpiresActive On
# 将所有文件和重定向缓存2周(A)。
ExpiresDefault A1209600
<FilesMatch \.php$>
# 禁止缓存PHP脚本,除非它们自己明确发送缓存头。否则所有脚本都必须覆盖mod_expires设置的头以获得其他缓存行为。如果引导过程中发生错误,可能会失败,如果在子目录中安装了非Drupal的PHP文件,也可能会出现问题。
ExpiresActive Off
</FilesMatch>
</IfModule>
# 如果未启用mod_rewrite,则设置回退资源。这允许Drupal在没有清洁URL的情况下工作。这需要Apache版本>= 2.2.16。如果Drupal不是通过顶级URL访问(即:http://example.com/drupal/ 而不是 http://example.com/),需要调整index.php的路径。
<IfModule !mod_rewrite.c>
FallbackResource /index.php
</IfModule>
# 各种重写规则。
<IfModule mod_rewrite.c>
RewriteEngine on
# 添加index.php重定向
# 将以 "index.php/" 开头的URL使用301重定向到正确的地址:
RewriteRule ^index.php/$ / [R=301,L]
RewriteRule ^index.php/(.*) /$1 [R=301,L]
# 如果通过https://访问,将"protossl"设置为"s"。如果启用了“www.”剥离或强制执行,以确保不会在http和https之间来回跳转。
RewriteRule ^ - [E=protossl]
RewriteCond %{HTTPS} on
RewriteRule ^ - [E=protossl:s]
# 确保即使在CGI或FastCGI下运行,Authorization HTTP头也可用于PHP。
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# 阻止访问以句点开头的“隐藏”目录。这包括版本控制系统(如Subversion或Git)用于存储控制文件的目录。文件名以句点开头的文件以及CVS使用的控制文件受到上面的FilesMatch指令保护。
#
# 注意:这仅在加载了mod_rewrite时有效。没有mod_rewrite,不可能通过.htaccess阻止整个目录的访问,因为此处不允许使用<DirectoryMatch>。
#
# 如果没有安装mod_rewrite,你应该从webroot中删除这些目录或以其他方式保护它们不被下载。
RewriteRule "/\.|^\.(?!well-known/)" - [F]
# 如果你的网站可以使用带有和不带有“www.”前缀的地址访问,可以使用以下设置之一将用户重定向到你首选的URL,带或不带“www.”前缀。选择仅一个选项:
#
# 要将所有用户重定向到带有“www.”前缀的地址,
# (http://example.com/foo 将被重定向到 http://www.example.com/foo)
# 取消注释以下内容:
# RewriteCond %{HTTP_HOST} .
# RewriteCond %{HTTP_HOST} !^www\. [NC]
# RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#
# 要将所有用户重定向到不带“www.”前缀的地址,
# (http://www.example.com/foo 将被重定向到 http://example.com/foo)
# 取消注释以下内容:
# RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
# RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]
# 如果你在子目录或VirtualDocumentRoot中使用Drupal,并且重写规则无法正常工作,请修改RewriteBase。
# 例如,如果你的网站位于 http://example.com/drupal,取消注释并修改以下行:
# RewriteBase /drupal
#
# 如果你的网站运行在 http://example.com/ 的VirtualDocumentRoot中,
# 取消注释以下行:
# RewriteBase /
# 将常见的PHP文件重定向到它们的新位置。
RewriteCond %{REQUEST_URI} ^(.*)?/(install\.php) [OR]
RewriteCond %{REQUEST_URI} ^(.*)?/(rebuild\.php)
RewriteCond %{REQUEST_URI} !core
RewriteRule ^ %1/core/%2 [L,QSA,R=301]
# 在安装期间重写install.php以查看mod_rewrite是否正常工作
RewriteRule ^core/install\.php core/install.php?rewrite=ok [QSA,L]
# 将不直接引用文件系统中的文件的所有请求传递给index.php。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]
# 出于安全原因,拒绝访问公共网站上的其他PHP文件。
# 注意:以下URI条件未锚定在开头(^),因为Drupal可能位于子目录中。为了进一步提高安全性,可以将'!/'替换为'!^/'。
# 允许访问 /core 中的PHP文件(如authorize.php或install.php):
RewriteCond %{REQUEST_URI} !/core/[^/]*\.php$
# 允许访问测试特定的PHP文件:
RewriteCond %{REQUEST_URI} !/core/modules/system/tests/https?\.php
# 允许访问Statistics模块的自定义前端控制器。
# 复制并调整此规则以直接执行贡献或自定义模块中的PHP文件,或在同一目录中运行另一个PHP应用程序。
RewriteCond %{REQUEST_URI} !/core/modules/statistics/statistics\.php$
# 禁止访问不符合上述规则的任何其他PHP文件。
# 特别是不允许直接提供autoload.php。
RewriteRule "^(.+/.*|autoload)\.php($|/)" - [F]
# 正确提供gzip压缩的CSS和JS文件。
# 需要启用mod_rewrite和mod_headers。
<IfModule mod_headers.c>
# 如果存在并且客户端接受gzip压缩,提供gzip压缩的CSS文件。
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*css_[a-zA-Z0-9-_]+)\.css$ $1\.css\.gz [QSA]
# 如果存在并且客户端接受gzip压缩,提供gzip压缩的JS文件。
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*js_[a-zA-Z0-9-_]+)\.js$ $1\.js\.gz [QSA]
# 提供正确的内容类型,并防止双重压缩。
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1,E=no-brotli:1]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1,E=no-brotli:1]
<FilesMatch "(\.js\.gz|\.css\.gz)$">
# 提供正确的编码类型。
Header set Content-Encoding gzip
# 强制代理缓存gzip和非gzip的css/js文件分开。
Header append Vary Accept-Encoding
</FilesMatch>
</IfModule>
</IfModule>
# 各种头部修复。
<IfModule mod_headers.c>
# 禁用内容嗅探,因为它是一个攻击向量。
Header always set X-Content-Type-Options nosniff
# 禁用Proxy头,因为它是一个攻击向量。
RequestHeader unset Proxy
</IfModule>
解释
保护文件和目录:保护特定文件类型不被访问。
不显示目录列表:防止显示目录内容。
默认处理程序:设置默认的索引文件。
SVGZ编码:为SVGZ文件设置正确的MIME类型和编码。
PHP设置:配置PHP设置,确保安全。
缓存控制:设置缓存策略。
回退资源:如果未启用mod_rewrite,设置回退资源。
重写规则:各种重写规则,包括隐藏目录、规范化URL、gzip压缩文件处理等。
头部修复:设置安全相关的HTTP头。
这些设置有助于增强Drupal网站的安全性和性能。
评论