-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvhost.example.conf
More file actions
138 lines (118 loc) · 6.99 KB
/
Copy pathvhost.example.conf
File metadata and controls
138 lines (118 loc) · 6.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# ============================================================================
# docu.msk-scripts.de, Apache vhost
# Speicherort auf dem Server: /etc/apache2/sites-available/docu.msk-scripts.de.conf
#
# Required modules: headers, rewrite, ssl, http2, expires, deflate
# Required snippet: /etc/apache2/snippets/docu-csp-hashes.conf
# (wird via Deploy aus build/csp-hashes.conf erzeugt)
# ============================================================================
# ----- HTTP → HTTPS Redirect --------------------------------------------------
<VirtualHost *:80>
ServerName docu.msk-scripts.de
Redirect permanent / https://docu.msk-scripts.de/
</VirtualHost>
# ----- HTTPS vhost ------------------------------------------------------------
<VirtualHost *:443>
ServerName docu.msk-scripts.de
ServerAdmin info@msk-scripts.de
DocumentRoot /var/www/html/docs_msk-scripts
Protocols h2 http/1.1
# ----- SSL ----------------------------------------------------------------
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/docu.msk-scripts.de/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/docu.msk-scripts.de/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
# ----- DocumentRoot -------------------------------------------------------
<Directory /var/www/html/docs_msk-scripts>
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# CSP-Snippet liegt nach Deploy zusätzlich im DocumentRoot, vorsorglich
# Apache-Config-Files niemals via HTTP ausliefern.
<FilesMatch "\.(conf|htaccess|htpasswd|ini)$">
Require all denied
</FilesMatch>
# ----- Umgezogene Seiten (301) --------------------------------------------
# Am 29.08.2026 wurden die vier zweisprachigen Dateipaare des Ticketbots
# aufgeloest: aus faq/{de,en} und service-setup/service-setup-{de,en} wurde
# je eine Seite, die deutsche liegt unter /de/. Die alten Adressen stehen
# in der Search Console, sie werden deshalb dauerhaft weitergeleitet statt
# ins Leere zu laufen.
#
# RedirectMatch statt Redirect, weil die Verzeichnisse nicht mehr
# existieren: mod_dir kann die Form ohne Schraegstrich nicht mehr selbst
# auf die mit Schraegstrich schieben. Das /?$ faengt beide ab.
RedirectMatch permanent ^/discord/discord_ticketbot/faq/en/?$ https://docu.msk-scripts.de/discord/discord_ticketbot/faq/
RedirectMatch permanent ^/discord/discord_ticketbot/faq/de/?$ https://docu.msk-scripts.de/de/discord/discord_ticketbot/faq/
RedirectMatch permanent ^/discord/discord_ticketbot/service-setup/service-setup-en/?$ https://docu.msk-scripts.de/discord/discord_ticketbot/service-setup/
RedirectMatch permanent ^/discord/discord_ticketbot/service-setup/service-setup-de/?$ https://docu.msk-scripts.de/de/discord/discord_ticketbot/service-setup/
# ----- Security Headers ---------------------------------------------------
# Zuerst alle Header entfernen, die irgendwo (security.conf, default-vhost,
# andere Includes) gesetzt sein könnten, damit es keine Duplikate gibt.
<IfModule mod_headers.c>
Header always unset X-Frame-Options
Header always unset X-Content-Type-Options
Header always unset X-XSS-Protection
Header always unset Strict-Transport-Security
Header always unset Referrer-Policy
Header always unset Permissions-Policy
Header always unset Feature-Policy
Header always unset Cross-Origin-Opener-Policy
Header always unset Cross-Origin-Embedder-Policy
Header always unset Cross-Origin-Resource-Policy
Header always unset Content-Security-Policy
Header always unset Content-Security-Policy-Report-Only
# X-XSS-Protection ist deprecated → wird NICHT mehr gesetzt.
# Strict Transport Security: 2 Jahre + Subdomains + preload-ready
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
# MIME-Type Sniffing aus
Header always set X-Content-Type-Options "nosniff"
# Clickjacking-Schutz (Defense-in-Depth zusätzlich zu CSP frame-ancestors)
Header always set X-Frame-Options "DENY"
# Referrer
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Cross-Origin Isolation
Header always set Cross-Origin-Opener-Policy "same-origin"
Header always set Cross-Origin-Embedder-Policy "require-corp"
Header always set Cross-Origin-Resource-Policy "same-origin"
# Permissions Policy: alles, was nicht gebraucht wird, deaktivieren
Header always set Permissions-Policy "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), display-capture=(), document-domain=(), encrypted-media=(), fullscreen=(self), geolocation=(), gyroscope=(), keyboard-map=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(), usb=(), web-share=(), xr-spatial-tracking=(), interest-cohort=()"
</IfModule>
# ----- Content-Security-Policy (auto-generiert) ---------------------------
# Wird nach jedem `yarn build` aus build/csp-hashes.conf erzeugt und beim
# Deploy nach /etc/apache2/snippets/docu-csp-hashes.conf kopiert.
Include /etc/apache2/snippets/docu-csp-hashes.conf
# ----- Compression --------------------------------------------------------
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css \
text/javascript application/javascript application/json \
application/xml image/svg+xml application/manifest+json
</IfModule>
# ----- Caching ------------------------------------------------------------
<IfModule mod_expires.c>
ExpiresActive On
# Hashed Assets dürfen 1 Jahr cached werden
<FilesMatch "\.(js|css|woff2?|ttf|eot|otf)$">
ExpiresDefault "access plus 1 year"
Header append Cache-Control "immutable"
</FilesMatch>
# Bilder etwas kürzer
<FilesMatch "\.(png|jpe?g|gif|svg|webp|avif|ico)$">
ExpiresDefault "access plus 30 days"
</FilesMatch>
# HTML niemals lange cachen, sonst sieht der Client veraltete Inline-Scripts
# die nicht mehr zur ausgelieferten CSP passen
<FilesMatch "\.(html|json)$">
ExpiresDefault "access plus 0 seconds"
Header set Cache-Control "no-cache, must-revalidate"
</FilesMatch>
</IfModule>
# ----- Pretty URLs / SPA-Fallback -----------------------------------------
# Docusaurus generiert echte HTML-Dateien für jede Route, also keine
# SPA-Rewrite-Logik nötig. 404.html als ErrorDocument.
ErrorDocument 404 /404.html
# ----- Logs ---------------------------------------------------------------
ErrorLog ${APACHE_LOG_DIR}/docu.msk-scripts.de-error.log
CustomLog ${APACHE_LOG_DIR}/docu.msk-scripts.de-access.log combined
</VirtualHost>