Skip to the content
Documentation
Help Start
Reading in:
  • German: 9,059 of 9,059 pages
About the help in other languages
All help pages

Apache .htaccess

Die vollständige .htaccess für Apache (und LiteSpeed): die ausgelieferte .htaccess_root Regel für Regel, wie Sie sie installieren und prüfen, und optionale Blöcke für eine HTTPS-Weiterleitung, Sicherheits-Header und…

Download as PDF

Address: https://doc.exponential.earth/exphelp/viewer/examples/web-servers/apache-htaccess.md

On this page

This page is a translation. Read the English original

Apache .htaccess

Der vorgesehene Weg, Exponential mit Apache auszuliefern, ist eine .htaccess-Datei im Wurzelverzeichnis der Installation. Die Datei wird als .htaccess_root ausgeliefert; das Beispiel unten, doc/eng-us/examples/htaccess, enthält wörtlich dieselben Regeln, mit einem Kopfkommentar, der sie erklärt, und drei optionalen Blöcken danach. Verwenden Sie es dort, wo Sie den virtuellen Host nicht bearbeiten können (oder wollen). Mit Zugriff auf den virtuellen Host setzt das Beispiel Apache, virtueller Host dieselben Regeln in den Serverkontext und erspart Apache bei jeder Anfrage eine Dateisuche pro Verzeichnis.

Warnung .htaccess bremst jede Anfrage. Sind .htaccess-Dateien erlaubt (AllowOverride alles außer None), geschweige denn genutzt, sucht Apache sie bei jeder Anfrage in jedem Verzeichnis des Pfads und liest und wertet sie aus, und die Ladezeiten der Seiten steigen drastisch (gemessen). Die einzige wirkliche Abhilfe ist, die Funktion für den virtuellen Host abzuschalten: AllowOverride None im virtuellen HTTPS-Host, und die Regeln in der Konfiguration des virtuellen Hosts selbst als mod_rewrite-Regeln. Das ist in Geschwindigkeitstests im Produktivbetrieb weit schneller und die Zeit für die Optimierung einer Produktivkonfiguration unbedingt wert. Stellen Sie sofort um: Übernehmen Sie die Regeln des Beispiels für einen virtuellen HTTPS-Host in Ihren virtuellen Host (mit dem statischen Cache auch staticcache_offload.conf), setzen Sie AllowOverride None, führen Sie apachectl configtest aus, laden Sie Apache neu und testen Sie die Website. Dieselben Regeln für andere Server: nginx, LiteSpeed, Caddy, IIS, Velocity (eingebaut); wohin Regeln für virtuelle Hosts in einem Control Panel gehören: Plesk, cPanel, DirectAdmin, ISPConfig. Unter LiteSpeed oder OpenLiteSpeed kann zusätzlich der Seiten-Cache des Servers anonyme Besucher und Crawler ohne PHP bedienen: Seiten-Caching mit LiteSpeed und OpenLiteSpeed.

Installieren

cd /var/www/example.com          # the installation root, where index.php is
cp .htaccess_root .htaccess      # copy, do not move: an update can bring a new version
apachectl configtest             # Syntax OK
systemctl reload httpd           # apache2 on Debian and Ubuntu

Oder lassen Sie die Konsole kopieren: ./console exp:setup:htaccess --apply kopiert .htaccess_root nach .htaccess (--static nimmt .htaccess_root_static), übernimmt Modus und Eigentümer der Vorlage, sichert eine schon vorhandene Datei und weigert sich, eine abweichende zu ersetzen, solange Sie nicht --force angeben. Ohne --apply zeigt der Befehl nur, was er tun würde. Siehe .htaccess und config.php von der Konsole einrichten.

Apache braucht mod_rewrite (Debian: a2enmod rewrite), und der virtuelle Host muss ihm erlauben, die Datei zu lesen:

<Directory /var/www/example.com>
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

Für die Rewrite-Regeln genügt AllowOverride FileInfo. Der optionale Header-Block braucht ebenfalls FileInfo, der optionale Caching-Block Indexes; ist keines davon erlaubt, beantwortet Apache jede Anfrage mit 500, und sein Fehlerprotokoll nennt die Zeile.

Um die optionalen Blöcke zu nutzen, kopieren Sie doc/eng-us/examples/htaccess statt .htaccess_root und aktivieren Sie, was Sie brauchen. Vergleichen Sie nach jedem Upgrade Ihre .htaccess mit der neuen .htaccess_root und übernehmen Sie neue Regeln. ./console exp:setup:htaccess zeigt diesen Unterschied als Diff und endet mit Exit-Code 1, solange die beiden abweichen; ./console exp:setup:status sagt, von welcher Vorlage .htaccess eine Kopie ist.

Die Datei

Die ersten Versionen dieser Datei kamen mit eZ Publish, der Software, aus der Exponential hervorgegangen ist (1999 - 2014). Ihre Rewrite-Regeln sind die von .htaccess_root und gehören zur Software (GNU GPL Version 2 oder später); das dokumentierte Beispiel um sie herum ist freie Dokumentation (GFDL 1.3 oder später), wie diese Seite.

# Apache .htaccess for Exponential 6
# ---------------------------------------------------------------------------
# What this is: the rewrite rules that make Apache serve an Exponential
# installation safely when the document root is the installation root (the
# directory with index.php). Only a fixed list of asset paths is sent as a
# file; every other request (URL aliases, modules, and also settings/, var/,
# vendor/, kernel/, composer.json) is answered by index.php, which never hands
# out the file. Dot files (.git, .env, .htaccess) answer 404 anywhere, and no
# .php below the root runs because its path was asked for.
#
# How to install it: the shipped file is .htaccess_root in the installation
# root. Copy it, do not move it, so an update can bring a new version:
#
#     cp .htaccess_root .htaccess
#
# The section "Rules" below is a verbatim copy of .htaccess_root of this
# release, for reading and for copying into a <Directory> block. The section
# "Optional" after it is not in .htaccess_root: HTTPS redirect, headers on
# static files and browser caching, each switched off or guarded until you
# turn it on. Never delete a rule of the "Rules" section to make something
# work; find the cause instead (doc/eng-us/install/13-security-hardening.md, 13.2).
#
# Needs: mod_rewrite, and AllowOverride All (or at least FileInfo) for the
# directory. Check with "apachectl configtest", then these requests:
#   /.git/config, /.env, /kernel/classes/ezini.php  -> 404
#   /settings/site.ini, /composer.json               -> a page from index.php, never the file
#
# Explained rule by rule: doc/eng-us/examples/web-servers/apache-htaccess.md
# The same rules for a virtual host (server context): doc/eng-us/examples/ezpublish.conf
#
# License: the first versions of this file came with the software Exponential
# grew out of, eZ Publish, 1999 - 2014. The rewrite rules are those of
# .htaccess_root, part of the software (GNU General Public License version 2
# or later, like the rest of the code). This documented example, its comments
# and optional sections, is free documentation under the GNU Free
# Documentation License 1.3 or later (doc/eng-us/README-LICENSE.md).

# ===========================================================================
# Rules (verbatim .htaccess_root)
# ===========================================================================

# Copy this file to a new file called .htaccess in your Exponential root
# to secure your installation by turning on .htaccess based virtual host mode.

DirectoryIndex index.php

RewriteEngine On
# No dot file or dot directory (.git, .env, .htaccess ...) is served or
# run, whatever folder it lies in; .well-known stays reachable.
RewriteRule (^|/)\.(?!well-known(/|$)) - [R=404,L]
# No script runs because its path was asked for, except the front
# controllers at the root: a .php below them (in the package store,
# an extension, var/) answers 404 instead of being executed.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.+/[^/]+\.(php[0-9]?|phtml|phar)$ - [R=404,L]
RewriteRule ^api/ index_rest.php [L]
RewriteRule ^index_rest\.php - [L]
# The SOAP server (settings/soap.ini EnableSOAP=true) is index_soap.php since
# Exponential 6.0.15; soap.php, its old name, only forwards to it. Uncomment
# when SOAP is switched on, and let the SOAP clients call index_soap.php:
#RewriteRule ^index_soap\.php - [L]
RewriteRule ^([^/]+/)?content/treemenu.* index_treemenu.php [L]
# WebDAV (settings/webdav.ini [GeneralSettings] EnableWebDAV=true): the server is
# index_webdav.php, reached as https://www.example.com/index_webdav.php/<siteaccess>/.
# Uncomment to let it answer on this host, or give it a host of its own that sends
# every request to index_webdav.php. webdav.php, its old name, only forwards to it
# and will be removed in a later major version: name index_webdav.php in new rules.
#RewriteRule ^index_webdav\.php - [L]
RewriteRule ^var/([^/]+/)?storage/images(-versioned)?/.* - [L]
# SVG images are sanitized on upload; served from the storage they also run
# nothing and load nothing when opened directly (needs mod_headers).
<IfModule mod_headers.c>
    <FilesMatch "(?i)\.svgz?$">
        Header always set Content-Security-Policy "sandbox; default-src 'none'; style-src 'unsafe-inline'"
        Header always set X-Content-Type-Options "nosniff"
    </FilesMatch>
</IfModule>
# The stored files of PDF exports generated once (Setup > PDF export): only
# names of letters, digits, ".", "_" and "-" ending in .pdf, as the export writes them.
RewriteRule ^var/([^/]+/)?storage/pdf/[A-Za-z0-9][A-Za-z0-9._-]*\.pdf$ - [L]
# Of the originals only the images (SVG images are shown from there);
# other uploads stay behind content/download and its permissions.
RewriteRule ^var/([^/]+/)?storage/original/image/.+\.(png|jpe?g|gif|webp|svg)$ - [L]
RewriteRule ^var/([^/]+/)?cache/(texttoimage|public)/.* - [L]
# With site.ini [FileSettings] CacheVarDir=var_cache (the caches of the sites in a
# tree of their own, multi-site hosting) their public caches are served from there:
#RewriteRule ^var_cache/([^/]+/)?cache/(texttoimage|public)/.* - [L]
RewriteRule ^design/[^/]+/(stylesheets|images|javascript|fonts)/.* - [L]
RewriteRule ^share/icons/.* - [L]
# Icon themes shipped by extensions (icon.ini [ExtensionSettings] IconExtensions[],
# extension/<name>/icons/). Only images with exactly one extension: a name like
# a.php.svg could otherwise be handed to PHP by an AddHandler mapping.
RewriteRule ^extension/[^/]+/icons/[A-Za-z0-9_/-]+\.(svg|png|gif)$ - [L]
RewriteRule ^extension/[^/]+/design/[^/]+/(stylesheets|flash|images|lib|javascripts?|fonts|vendor|media)/.* - [L]
RewriteRule ^packages/styles/.+/(stylesheets|images|javascript)/[^/]+/.* - [L]
RewriteRule ^packages/styles/.+/thumbnail/.* - [L]
# Only the preview images of imported packages: their XML, SQL and
# settings are not for the web.
RewriteRule ^var/storage/packages/.+\.(png|jpe?g|gif|webp)$ - [L]

#  Makes it possible to placed your favicon at the root of your
#  Exponential instance. It will then be served directly.
RewriteRule ^favicon\.ico - [L]
#  Uncomment the line below if you want you favicon be served from the standard design.
#  You can customize the path to favicon.ico by replacing design/standard/images/favicon.ico
#  by the adequate path.
#RewriteRule ^favicon\.ico /design/standard/images/favicon.ico [L]
RewriteRule ^design/standard/images/favicon\.ico - [L]

# Give direct access to robots.txt for use by crawlers (Google, Bing, Spammers..)
RewriteRule ^robots\.txt - [L]

# The site's service workers, which have to be served from the root: index.js, the
# Exponential Service Workers Index, and sw.js, its old name, kept for browsers registered before.
RewriteRule ^index\.js$ - [L]
RewriteRule ^sw\.js$ - [L]

# Uncomment the following lines when using popup style debug.
# RewriteRule ^var/cache/debug\.html.* - [L]
# RewriteRule ^var/[^/]+/cache/debug\.html.* - [L]

# Platform for Privacy Preferences Project ( P3P ) related files for Internet Explorer
# More info here : http://en.wikipedia.org/wiki/P3p
RewriteRule ^w3c/p3p\.xml - [L]

## >>> LiteSpeed page cache (off) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
## LiteSpeed Web Server (Enterprise) and OpenLiteSpeed can keep whole pages and
## answer anonymous visitors and crawlers from them without running PHP: no
## plugin and no code, only the rules below. Apache and nginx never read them
## (<IfModule LiteSpeed>). Every line, purging, checks and troubleshooting:
##   doc/eng-us/guides/litespeed-page-cache.md
##
## To switch it on, remove the first "#" of every line from the ">>>" line to
## the "<<<" line (a "##" line keeps one "#" and stays a comment), or run:
##   sed -i '/^## >>> LiteSpeed page cache/,/^## <<< LiteSpeed page cache/ s/^#//' .htaccess
## Then request a page twice without cookies; the second answer says "hit":
##   curl -sI https://www.example.com/ | grep -i x-litespeed-cache
## The server needs a cache directory (LiteSpeed Enterprise: CacheRoot at
## server level). OpenLiteSpeed reads only the rewrite rules of .htaccess,
## only with autoLoadHtaccess on and only after a restart, and needs its cache
## module on for the virtual host: see the guide.
##
#<IfModule LiteSpeed>
## Look the request up in the page cache.
#CacheLookup on
## Only reads: every form (POST) and every other write reaches PHP.
#RewriteCond %{REQUEST_METHOD} ^(GET|HEAD)$
## No query string: searches, filters and tracking parameters reach PHP.
#RewriteCond %{QUERY_STRING} ^$
## Nobody with a session or signed in. The session cookie is PHPSESSID with
## site.ini [Session] SessionNameHandler=default (php.ini session.name) and
## eZSESSID<md5 of the siteaccess> with SessionNameHandler=custom; the kernel
## sets is_logged_in=true for every signed-in user. Editors, members and a
## visitor with a basket all carry one. Add cookies of your own that change
## what a page shows, separated by "|".
#RewriteCond %{HTTP_COOKIE} !(eZSESSID|PHPSESSID|is_logged_in) [NC]
## Not the views that differ per visitor or change something, with or without
## a siteaccess in front: the administration (put the URI of yours if it is
## not "admin"), user/, shop/, notification/, layout/, ezjscore/, setup/ and
## every content/ view except content/view/. REST, SOAP, WebDAV and the tree
## menu never get here: the rules above send them their own way.
#RewriteCond %{REQUEST_URI} !^/([^/]+/)?((admin|user|shop|notification|layout|ezjscore|setup)(/|$)|content/(?!view/)) [NC]
## The administration on a host name of its own: remove one more "#", adjust.
##RewriteCond %{HTTP_HOST} !^admin\. [NC]
## Keep the page 120 seconds (max-age). Nothing removes it when an editor
## publishes: anonymous visitors see a change at most max-age seconds later.
## Never cache pages with debug output (site.ini DebugOutput, DebugByIP).
#RewriteRule .* - [E=cache-control:max-age=120]
#</IfModule>
## <<< LiteSpeed page cache <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

RewriteRule .* index.php

# ===========================================================================
# Optional (not in .htaccess_root). Read each block before enabling it.
# ===========================================================================
#
# Nothing below changes which paths are served or routed. Blocks 2 and 3 only
# add response headers; block 1 is a redirect and is the only one that must
# move (see its comment). mod_headers needs AllowOverride FileInfo, mod_expires
# AllowOverride Indexes; without them Apache answers 500.

# --- 1. Redirect plain HTTP to HTTPS -----------------------------------------
# Off by default. Better done in the port 80 virtual host
# (doc/eng-us/examples/ezpublish.conf). If you can only use .htaccess, move these two
# lines directly below "RewriteEngine On" above and remove the "#".
# Behind a proxy or load balancer that terminates TLS, %{HTTPS} is always
# "off" here: test X-Forwarded-Proto instead, and only if the proxy always
# sets it (else every request loops):
#   RewriteCond %{HTTP:X-Forwarded-Proto} !https
#RewriteCond %{HTTPS} off
#RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# --- 2. Security headers on static files ------------------------------------
# The kernel sends these on its own pages (site.ini [HTTPHeaderSettings]
# SecurityHeaders[]); Apache sends nothing extra on files it serves itself.
# These are the same values as the kernel's defaults. "setifempty" keeps a
# header that index.php already sent.
<IfModule mod_headers.c>
    Header setifempty X-Content-Type-Options "nosniff"
    Header setifempty X-Frame-Options "SAMEORIGIN"
    Header setifempty Referrer-Policy "strict-origin-when-cross-origin"
    Header setifempty Permissions-Policy "camera=(), microphone=(), payment=(), usb=()"
    # HSTS: only once every name of the site is served over HTTPS for good.
    # Start short (300) and raise it to a year later; a browser remembers it
    # for the whole period (doc/eng-us/install/13-security-hardening.md, 13.9).
    # Set it here or in site.ini SecurityHeaders[Strict-Transport-Security],
    # not in both places.
    #Header always set Strict-Transport-Security "max-age=300" "expr=%{HTTPS} == 'on'"
</IfModule>

# --- 3. Browser caching of images and design files ---------------------------
# Image URLs change when the image changes (the version is in the path), so
# they can be cached for a long time. Design files keep their names: keep
# their lifetime short, or use the packer's file names with the modification
# time (ezjscore.ini [Packer] AppendLastModifiedTime=enabled).
<IfModule mod_expires.c>
    <If "%{REQUEST_URI} =~ m#^/var/([^/]+/)?storage/images(-versioned)?/#">
        ExpiresActive On
        ExpiresDefault "access plus 1 year"
    </If>
    <ElseIf "%{REQUEST_URI} =~ m#^/(extension/[^/]+/)?design/[^/]+/(stylesheets|images|javascripts?|fonts|lib)/#">
        ExpiresActive On
        ExpiresDefault "access plus 7 days"
    </ElseIf>
    <ElseIf "%{REQUEST_URI} =~ m#^/(share|extension/[^/]+)/icons/#">
        ExpiresActive On
        ExpiresDefault "access plus 7 days"
    </ElseIf>
</IfModule>

Die Regeln im Einzelnen

RegelWas sie tutWarum
DirectoryIndex index.php/ führt index.php ausdie Startseite
RewriteRule (^|/)\.(?!well-known(/|$)) - [R=404,L]jeder Pfad mit einem Segment, das mit einem Punkt beginnt, beantwortet 404, außer .well-known.git/config, .env, der .cache eines Pakets, die eigene .htaccess einer Erweiterung
RewriteCond %{REQUEST_FILENAME} -f + RewriteRule ^.+/[^/]+\.(php[0-9]?|phtml|phar)$ - [R=404,L]ein vorhandenes Skript unterhalb des Wurzelverzeichnisses beantwortet 404keine Bibliothek, kein Installer, keine Paketeinstellung und kein verirrtes Skript wird ausgeführt, nur weil sein Pfad angefragt wurde; nur die Front-Controller im Wurzelverzeichnis laufen
RewriteRule ^api/ index_rest.php [L], ^index_rest\.php - [L]die REST-APIindex_rest.php ist der REST-Front-Controller
#RewriteRule ^index_soap\.php - [L] (auskommentiert)der SOAP-Server, wenn soap.ini [GeneralSettings] EnableSOAP=true giltindex_soap.php ist seit 6.0.15 der SOAP-Front-Controller; soap.php leitet nur dorthin weiter. Nehmen Sie mit SOAP an das Kommentarzeichen weg, sonst enden SOAP-Anfragen bei index.php; siehe Das SOAP-Einstiegsskript heißt jetzt index_soap.php
RewriteRule ^([^/]+/)?content/treemenu.* index_treemenu.php [L]das Baummenü der Administration, mit oder ohne vorangestellten Siteaccessein schlanker Front-Controller für das JSON des Baums
#RewriteRule ^index_webdav\.php - [L] (auskommentiert)WebDAV auf diesem Host, sobald einkommentiertindex_webdav.php ist seit 6.0.15 der WebDAV-Server; webdav.php leitet nur dorthin weiter (was zu ändern ist)
^var/([^/]+/)?storage/images(-versioned)?/.*gespeicherte Bildvarianten werden als Datei gesendetBilder in Inhalten
der Block <FilesMatch "(?i)\.svgz?$">ein SVG wird mit Content-Security-Policy: sandbox ... gesendetein direkt geöffnetes SVG führt nichts aus und lädt nichts
^var/([^/]+/)?storage/pdf/...\.pdf$gespeicherte PDF-ExporteSetup > PDF-Export
^var/([^/]+/)?storage/original/image/...nur die Bild-Originaleandere Uploads liefert content/download aus, das die Berechtigungen prüft
^var/([^/]+/)?cache/(texttoimage|public)/.*die öffentlichen Caches (gepackte Skripte und Styles)der Packer von ezjscore schreibt dorthin
^var_cache/... (auskommentiert)die öffentlichen Caches in einem eigenen Baumnur mit site.ini [FileSettings] CacheVarDir=var_cache
^design/..., ^share/icons/.*, ^extension/[^/]+/design/...Stylesheets, Bilder, Skripte und Schriften der Designsnur die jeweils gelisteten Verzeichnisarten; bei einer Erweiterung auch vendor und media
^extension/[^/]+/icons/[A-Za-z0-9_/-]+\.(svg|png|gif)$die Icon-Themes der Erweiterungen (icon.ini [ExtensionSettings] IconExtensions[])nur SVG-, PNG- und GIF-Bilder mit genau einer Dateiendung: ein Name wie a.php.svg könnte sonst über ein AddHandler-Mapping an PHP gehen
^packages/styles/..., ^var/storage/packages/.+\.(png|jpe?g|gif|webp)$Paket-Styles und VorschaubilderXML, SQL und Einstellungen eines Pakets sind nicht fürs Web bestimmt; SVG ist nicht gelistet, es kann Skript enthalten
favicon.ico, robots.txt, index.js, sw.js, w3c/p3p.xmlaus dem Wurzelverzeichnis gesendetder Service Worker muss aus dem Wurzelverzeichnis ausgeliefert werden
der Block ## >>> LiteSpeed page cache ... ## <<< LiteSpeed page cache (auskommentiert)nach dem Einkommentieren nur unter LiteSpeed Enterprise und OpenLiteSpeed (<IfModule LiteSpeed>): anonyme GET- und HEAD-Anfragen ohne Abfragezeichenkette, Sitzungs- oder Anmelde-Cookie, außerhalb der Administrations-, Benutzer-, Shop- und Bearbeitungsansichten, bewahrt der Seiten-Cache des Servers max-age Sekunden lang aufbedient anonyme Besucher und Crawler ohne PHP; Apache überspringt ihn. Jede Zeile: Seiten-Caching mit LiteSpeed und OpenLiteSpeed
RewriteRule .* index.phpalles andere führt index.php ausURL-Aliase und Module; auch settings/site.ini, composer.json, var/log/..., die index.php mit einer Seite oder einem 404 beantwortet, niemals mit der Datei

var/, settings/, vendor/, .git, composer.* und .env brauchen also keine eigenen Regeln: Die Punktregel und „nicht auf der Liste, also index.php“ decken sie ab.

Zwei Details des Verzeichniskontexts (.htaccess) sollten Sie kennen:

  • Nach einem Rewrite durchläuft Apache die Regeln erneut mit dem neuen Pfad. index_rest.php hat für diese zweite Runde eine Durchlassregel (^index_rest\.php - [L]); index_treemenu.php hat keine, daher endet die Anfrage für das Baummenü unter .htaccess bei index.php, das das Baummenü ebenfalls ausliefert, nur etwas langsamer. Im Serverkontext (dem Beispiel für den virtuellen Host) beendet [L] die Verarbeitung, und index_treemenu.php antwortet.
  • .well-known ist von der Punktregel ausgenommen, steht aber nicht auf der Asset-Liste, daher erreicht /.well-known/... index.php. Ein Zertifikats-Client, der dort Challenge-Dateien ablegt (certbot --webroot), braucht einen Host für reines HTTP, der das Verzeichnis ausliefert, wie es der Host für Port 80 im Beispiel für den virtuellen Host tut.

Die optionalen Blöcke

  1. HTTP zu HTTPS. Besser im virtuellen Host für Port 80 erledigt. Wenn Sie nur .htaccess haben, verschieben Sie die zwei Zeilen direkt unter RewriteEngine On. Hinter einem Proxy, der TLS terminiert, ist %{HTTPS} immer aus: Prüfen Sie stattdessen X-Forwarded-Proto, und zwar nur, wenn der Proxy den Header immer setzt, sonst läuft jede Anfrage in eine Schleife.
  2. Sicherheits-Header für statische Dateien. Der Kernel sendet X-Content-Type-Options, X-Frame-Options, Referrer-Policy und Permissions-Policy auf seinen Seiten (site.ini [HTTPHeaderSettings] SecurityHeaders[]); Apache sendet bei Dateien, die er selbst ausliefert, nichts davon. Der Block ergänzt dieselben Werte mit setifempty, sodass eine Seite die des Kernels behält. HSTS bleibt auskommentiert: Setzen Sie es, sobald jeder Name über HTTPS ausgeliefert wird, hier oder in site.ini, nicht an beiden Stellen.
  3. Browser-Caching. Die URLs gespeicherter Bilder ändern sich, wenn sich das Bild ändert, daher ist ein Jahr unbedenklich. Design-Dateien behalten ihre Namen: Halten Sie ihre Lebensdauer kurz, solange sich das Design ändert.

Prüfen

for p in /.git/config /.env /kernel/classes/ezini.php /extension/ezjscore/ezinfo.php; do
  printf '%-34s %s\n' "$p" "$(curl -s -o /dev/null -w '%{http_code}' https://example.com$p)"     # 404 each
done
curl -s https://example.com/settings/site.ini | grep -c '^\[DatabaseSettings\]'   # 0: a page, not the file
curl -sI https://example.com/design/admin4/stylesheets/components.css | head -1   # 200

Ein 200 für .git/config bedeutet, dass die Regeln nicht aktiv sind: AllowOverride lässt sie nicht zu, mod_rewrite ist aus, oder das Document Root ist nicht das Wurzelverzeichnis der Installation. Halten Sie an und beheben Sie das, bevor die Site von außen erreichbar ist.

Wie dieses Beispiel geprüft wurde: httpd -t mit der Datei innerhalb eines <Directory>-Blocks, und ein Wegwerf-Apache 2.4, der sie als .htaccess für ein Test-Document-Root verwendete und jede Anfrage der Testliste wie erwartet beantwortete, einschließlich der Header des optionalen Blocks.

Verwandte Seiten

Something wrong on this page? Report an error

Documentation license

This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x