Zur Navigation

Htaccess prodziert "Internal Server Error" Fehler

1 Tricktrommler

Hallo,
schön, dass es dieses Forum gibt. Ich bin in Sachen htacces blutiger Anfänger, doch es war ja schon immer schwierig die ersten Schritte zu gehen, um sicher zu werden. Wenn das Thema im Forum schon beleuchtet wurde, sorry, ich weiß auch gar nicht so recht wonach ich suchen soll. Beiträge mit htaccess und gzip habe ich mir durchgelesen, aber kleine Lösung für mein Frage gefunden.

Ich habe eine bestehende htaccess, die ich mit Gzip und und Browser Caching erweitern möchte. Füge ich die entsprechenden Parameter hinzu, produziert die Seite einen Internal Server Error und wird im Web nicht mehr angezeigt.

Danke für Erleuchtung.

>>> So schaut die bestehende .htaccess aus:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^green-tera-protect\.de [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://green-tera-protect.de/$1 [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

>>> Dies füge ich hinzu und lade es wieder in die Datenbank:

# Browser Caching aktivieren
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 2 days"

# Aktiviert GZIP Komprimierung
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
</IfModule>

#Zugriffe auf .htaccess verhindern
<files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</files>

# Verhindert das einfache Auslesen von Nutzernamen
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} .*author=(.+.?) [NC]
RewriteRule (.*) /blog/?author= [NC,L,R=301]

Header set Strict-Transport-Security "max-age=10886400"; includeSubDomains; preload

02.04.2020 13:39

2 Jörg Kruse

Im HSTS-Header muss das zweite Anführungszeichen ganz an das Ende:

Header set Strict-Transport-Security "max-age=10886400; includeSubDomains; preload"

Falls der Internal Server Error danach immer noch auftritt, würde ich die zusätzlichen Abschnitte Schritt für Schritt hinzufügen, um herauszufinden, in welchem Abschnitt der Fehler verursacht wird.

02.04.2020 14:42

3 Tricktrommler

Hallo Jörg,
vielen herzlichen Dank. Die Verschiebung des Anführungszeichens ans Ende war die Lösung.

Interessanterweise habe ich diese htaccess-Zusammenstellung, also ohne Anführungszeichen, in anderen htaccess Dateien am laufen ohne dass sie Probleme verursachen. Merkwürdig. Das werde ich nun in jedem Falle anpassen

Cheers! Und bleib gesund!
Frank

02.04.2020 15:35

4 Sabine (Gast)

Hallo Jörg,

Ich habe die folgende htaccess Für eine WordPress-Webseite:
<FilesMatch "(\.htaccess)">
 Order deny,allow
 Deny from all
</FilesMatch>

AddType image/x-icon .ico
AddType font/woff .woff
AddType application/font-woff2 .woff2
AddType application/javascript .js

<ifModule mod_headers.c>
 Header set X-Frame-Options "SAMEORIGIN"
 Header set X-XSS-Protection "1; mode=block"
 Header set X-Content-Type-Options: "nosniff"
 Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
 Header set Referrer-Policy "no-referrer"
 Header set Feature-Policy "accelerometer 'none'; camera 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; usb 'none'"
 Header set Expect-CT "enforce, max-age=604800"
 Header set Connection keep-alive
 Header always edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
<FilesMatch "\.(ico|pdf|js|css|gif|png|jpg|jpeg|txt)$">
 Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
<FilesMatch "\.(js|css|xml|html|gz)$">
 Header append Vary Accept-Encoding
</FilesMatch>
<FilesMatch "\.(htm|html|php)$">
 Header set X-UA-Compatible "ie=edge"
</FilesMatch>
</ifModule>

<IfModule mod_expires.c>
 ExpiresActive On
 ExpiresDefault "access plus 2 month"
 ExpiresByType text/html A36000
 ExpiresByType text/css "access plus 1 month"
 ExpiresByType text/xml "access plus 2 month"
 ExpiresByType application/javascript "access plus 1 month"
 ExpiresByType application/pdf "access 6 month"
 ExpiresByType image/gif "access plus 1 year"
 ExpiresByType image/jpg "access plus 1 year"
 ExpiresByType image/jpeg "access plus 1 year"
 ExpiresByType image/png "access plus 1 year"
 ExpiresByType image/svg "access plus 2 month"
 ExpiresByType image/svg+xml "access plus 2 month"
 ExpiresByType image/x-icon "access plus 1 year"
 ExpiresByType font/opentype "access plus 1 year"
 ExpiresByType font/eot "access plus 1 year"
 ExpiresByType font/ttf "access plus 1 year"
 ExpiresByType application/x-font-ttf "access plus 1 year"
 ExpiresByType application/font-woff "access plus 1 year"
 ExpiresByType application/x-font-woff "access plus 1 year"
 ExpiresByType font/woff "access plus 1 year"
 ExpiresByType application/font-woff2 "access plus 1 year"
</IfModule>

<IfModule mod_deflate.c>
<FilesMatch "\.(html|css|js|xml|php|ttf|eot|woff|woff2|svg|txt)$">
 SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{QUERY_STRING} (eval\() [NC,OR]
	RewriteCond %{QUERY_STRING} (127\.0\.0\.1) [NC,OR]
	RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR]
	RewriteCond %{QUERY_STRING} (javascript:)(.*)(;) [NC,OR]
	RewriteCond %{QUERY_STRING} (base64_encode)(.*)(\() [NC,OR]
	RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC,OR]
	RewriteCond %{QUERY_STRING} (<|%3C)(.*)script(.*)(>|%3) [NC,OR]
	RewriteCond %{QUERY_STRING} (\\|\.\.\.|\.\./|~|`|<|>|\|) [NC,OR]
	RewriteCond %{QUERY_STRING} (boot\.ini|etc/passwd|self/environ) [NC,OR]
	RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumb)?)\.php [NC,OR]
	RewriteCond %{QUERY_STRING} (\'|\")(.*)(drop|insert|md5|select|union) [NC]
	RewriteRule .* - [F]
</IfModule>
<IfModule mod_rewrite.c>
	RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|put|trace|track) [NC]
	RewriteRule .* - [F]
</IfModule>
<IfModule mod_rewrite.c>
	RewriteCond %{HTTP_REFERER} ([a-z0-9]{2000,}) [NC,OR]
	RewriteCond %{HTTP_REFERER} (semalt.com|todaperfeita) [NC]
	RewriteRule .* - [F]
</IfModule>
<IfModule mod_alias.c>
	RedirectMatch 403 (?i)([a-z0-9]{2000,})
	RedirectMatch 403 (?i)(https?|ftp|php):/
	RedirectMatch 403 (?i)(base64_encode)(.*)(\()
	RedirectMatch 403 (?i)(=\\\'|=\\%27|/\\\'/?)\.
	RedirectMatch 403 (?i)/(\$(\&)?|\*|\"|\.|,|&|&amp;?)/?$
	RedirectMatch 403 (?i)(\{0\}|\(/\(|\.\.\.|\+\+\+|\\\"\\\")
	RedirectMatch 403 (?i)(~|`|<|>|:|;|,|%|\\|\{|\}|\[|\]|\|)
	RedirectMatch 403 (?i)/(=|\$&|_mm|cgi-|muieblack)
	RedirectMatch 403 (?i)(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|etc/passwd|eval\(|self/environ)
	RedirectMatch 403 (?i)\.(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf)$
	RedirectMatch 403 (?i)/(^$|(wp-)?config|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell)\.php
</IfModule>
<IfModule mod_setenvif.c>
	SetEnvIfNoCase User-Agent ([a-z0-9]{2000,}) bad_bot
	SetEnvIfNoCase User-Agent (archive.org|binlar|casper|checkpriv|choppy|clshttp|cmsworld|diavol|dotbot|extract|feedfinder|flicky|g00g1e|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|postrank|purebot|pycurl|python|seekerspider|siclab|skygrid|sqlmap|sucker|turnit|vikspider|winhttp|xxxyy|youda|zmeu|zune) bad_bot
</IfModule>

<files install.php>
 Order allow,deny
 Deny from all
</files>
 
<files wp-config.php>
 Order allow,deny
 Deny from all
</files>

<files readme.html>
 Order Allow,Deny
 Deny from all
 Satisfy all
</files>

<Files liesmich.html>
 Order Allow,Deny
 Deny from all
 Satisfy all
</files>
 	
<files error_log>
 Order allow,deny
 Deny from all
</files>

<files xmlrpc.php>
 Order Deny,Allow
 Deny from all
</files>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>

# BEGIN WordPress
# Die Anweisungen (Zeilen) zwischen `BEGIN WordPress` und `END WordPress` sind
# dynamisch generiert und sollten nur über WordPress-Filter geändert werden.
# Alle Änderungen an den Anweisungen zwischen diesen Markierungen werden überschrieben.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress


Wenn ich nun aus dieser Datei den folgenden Abschnitt entferne, dann bekomme ich die Fehlermeldung 500.
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{QUERY_STRING} (eval\() [NC,OR]
	RewriteCond %{QUERY_STRING} (127\.0\.0\.1) [NC,OR]
	RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR]
	RewriteCond %{QUERY_STRING} (javascript:)(.*)(;) [NC,OR]
	RewriteCond %{QUERY_STRING} (base64_encode)(.*)(\() [NC,OR]
	RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC,OR]
	RewriteCond %{QUERY_STRING} (<|%3C)(.*)script(.*)(>|%3) [NC,OR]
	RewriteCond %{QUERY_STRING} (\\|\.\.\.|\.\./|~|`|<|>|\|) [NC,OR]
	RewriteCond %{QUERY_STRING} (boot\.ini|etc/passwd|self/environ) [NC,OR]
	RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumb)?)\.php [NC,OR]
	RewriteCond %{QUERY_STRING} (\'|\")(.*)(drop|insert|md5|select|union) [NC]
	RewriteRule .* - [F]
</IfModule>
<IfModule mod_rewrite.c>
	RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|put|trace|track) [NC]
	RewriteRule .* - [F]
</IfModule>
<IfModule mod_rewrite.c>
	RewriteCond %{HTTP_REFERER} ([a-z0-9]{2000,}) [NC,OR]
	RewriteCond %{HTTP_REFERER} (semalt.com|todaperfeita) [NC]
	RewriteRule .* - [F]
</IfModule>
<IfModule mod_alias.c>
	RedirectMatch 403 (?i)([a-z0-9]{2000,})
	RedirectMatch 403 (?i)(https?|ftp|php):/
	RedirectMatch 403 (?i)(base64_encode)(.*)(\()
	RedirectMatch 403 (?i)(=\\\'|=\\%27|/\\\'/?)\.
	RedirectMatch 403 (?i)/(\$(\&)?|\*|\"|\.|,|&|&amp;?)/?$
	RedirectMatch 403 (?i)(\{0\}|\(/\(|\.\.\.|\+\+\+|\\\"\\\")
	RedirectMatch 403 (?i)(~|`|<|>|:|;|,|%|\\|\{|\}|\[|\]|\|)
	RedirectMatch 403 (?i)/(=|\$&|_mm|cgi-|muieblack)
	RedirectMatch 403 (?i)(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|etc/passwd|eval\(|self/environ)
	RedirectMatch 403 (?i)\.(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf)$
	RedirectMatch 403 (?i)/(^$|(wp-)?config|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell)\.php
</IfModule>
<IfModule mod_setenvif.c>
	SetEnvIfNoCase User-Agent ([a-z0-9]{2000,}) bad_bot
	SetEnvIfNoCase User-Agent (archive.org|binlar|casper|checkpriv|choppy|clshttp|cmsworld|diavol|dotbot|extract|feedfinder|flicky|g00g1e|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|postrank|purebot|pycurl|python|seekerspider|siclab|skygrid|sqlmap|sucker|turnit|vikspider|winhttp|xxxyy|youda|zmeu|zune) bad_bot
</IfModule>

Diesem Abschnitt habe ich vor einigen Monaten eingefügt und deshalb verstehe ich nicht, wieso eine Fehlermeldung erscheint, wenn dieser Abschnitt wieder entfernt wird.

Und das ist dann der Code ohne den genannten Abschnitt:
<FilesMatch "(\.htaccess)">
 Order deny,allow
 Deny from all
</FilesMatch>

AddType image/x-icon .ico
AddType font/woff .woff
AddType application/font-woff2 .woff2
AddType application/javascript .js

<ifModule mod_headers.c>
 Header set X-Frame-Options "SAMEORIGIN"
 Header set X-XSS-Protection "1; mode=block"
 Header set X-Content-Type-Options: "nosniff"
 Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
 Header set Referrer-Policy "no-referrer"
 Header set Feature-Policy "accelerometer 'none'; camera 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; usb 'none'"
 Header set Expect-CT "enforce, max-age=604800"
 Header set Connection keep-alive
 Header always edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
<FilesMatch "\.(ico|pdf|js|css|gif|png|jpg|jpeg|txt)$">
 Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
<FilesMatch "\.(js|css|xml|html|gz)$">
 Header append Vary Accept-Encoding
</FilesMatch>
<FilesMatch "\.(htm|html|php)$">
 Header set X-UA-Compatible "ie=edge"
</FilesMatch>
</ifModule>

<IfModule mod_expires.c>
 ExpiresActive On
 ExpiresDefault "access plus 2 month"
 ExpiresByType text/html A36000
 ExpiresByType text/css "access plus 1 month"
 ExpiresByType text/xml "access plus 2 month"
 ExpiresByType application/javascript "access plus 1 month"
 ExpiresByType application/pdf "access 6 month"
 ExpiresByType image/gif "access plus 1 year"
 ExpiresByType image/jpg "access plus 1 year"
 ExpiresByType image/jpeg "access plus 1 year"
 ExpiresByType image/png "access plus 1 year"
 ExpiresByType image/svg "access plus 2 month"
 ExpiresByType image/svg+xml "access plus 2 month"
 ExpiresByType image/x-icon "access plus 1 year"
 ExpiresByType font/opentype "access plus 1 year"
 ExpiresByType font/eot "access plus 1 year"
 ExpiresByType font/ttf "access plus 1 year"
 ExpiresByType application/x-font-ttf "access plus 1 year"
 ExpiresByType application/font-woff "access plus 1 year"
 ExpiresByType application/x-font-woff "access plus 1 year"
 ExpiresByType font/woff "access plus 1 year"
 ExpiresByType application/font-woff2 "access plus 1 year"
</IfModule>

<IfModule mod_deflate.c>
<FilesMatch "\.(html|css|js|xml|php|ttf|eot|woff|woff2|svg|txt)$">
 SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>

<files install.php>
 Order allow,deny
 Deny from all
</files>
 
<files wp-config.php>
 Order allow,deny
 Deny from all
</files>

<files readme.html>
 Order Allow,Deny
 Deny from all
 Satisfy all
</files>

<Files liesmich.html>
 Order Allow,Deny
 Deny from all
 Satisfy all
</files>
 	
<files error_log>
 Order allow,deny
 Deny from all
</files>

<files xmlrpc.php>
 Order Deny,Allow
 Deny from all
</files>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>

# BEGIN WordPress
# Die Anweisungen (Zeilen) zwischen `BEGIN WordPress` und `END WordPress` sind
# dynamisch generiert und sollten nur über WordPress-Filter geändert werden.
# Alle Änderungen an den Anweisungen zwischen diesen Markierungen werden überschrieben.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Wo liegt denn der Fehler und wie kann ich diesen lösen?

30.04.2020 12:28

5 Jörg Kruse

Du definierst hier die Umgebungsvariable bad_bot:

<IfModule mod_setenvif.c>
	SetEnvIfNoCase User-Agent ([a-z0-9]{2000,}) bad_bot
	SetEnvIfNoCase User-Agent (archive.org|binlar|casper|checkpriv|choppy|clshttp|cmsworld|diavol|dotbot|extract|feedfinder|flicky|g00g1e|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|postrank|purebot|pycurl|python|seekerspider|siclab|skygrid|sqlmap|sucker|turnit|vikspider|winhttp|xxxyy|youda|zmeu|zune) bad_bot
</IfModule>

Hast du die noch irgendwo im Einsatz, wo sie jetzt fehlt?

30.04.2020 16:13

6 Sabine (Gast)

Hallo Jörg,
danke für deine Antwort. Verstehe leider nicht, was du meinst.
Ich habe die komplette Datei auf der Seite einer Freundin im Einsatz. Und zwar hier: https://perfectnailsgermany.de/

Wenn ich den einen Abschnitt entferne, dann kommt die Fehlermeldung 500.

30.04.2020 16:20

7 Jörg Kruse

Was passiert denn, wenn du die vier Zeieln nicht mitlöschst, sondern stehen lässt?

Der gekürzte Code ist für sich genommen nicht fehlerhaft. Kann aber sein, dass die Datei / das Dateiformat nicht OK ist, siehe hier unter 4.:

https://jkip.de/howtos/mod_rewrite-fehlerbehandlung

30.04.2020 17:50 | geändert: 30.04.2020 17:52

8 Sabine (Gast)

habe bisher noch nicht ausprobiert, den genannten Abschnitt bis auf die von dir genannten Zeilen zu löschen, denn ich möchte nicht, dass der Onlineshop wieder nicht funktioniert. Das würde meine Bekannte bestimmt nicht erfreuen.
Wieso sollte ich die von dir genannten Zeilen nicht löschen?
Wieso sollte ich diese Zeilen behalten?
Bitte erkläre mir das doch nach Möglichkeit.

Dass die Datei oder Das Dateiformat falsch ist, denn sonst würde die Datei stets nicht funktionieren. Ich ändere ja nur die Datei und speichere diese ab.

02.05.2020 08:34

9 Jörg Kruse

habe bisher noch nicht ausprobiert, den genannten Abschnitt bis auf die von dir genannten Zeilen zu löschen, denn ich möchte nicht, dass der Onlineshop wieder nicht funktioniert. Das würde meine Bekannte bestimmt nicht erfreuen.

Du kannst die .htaccess Datei auch in einer Testumgebung testen. Im einfachsten Fall reicht vielleicht schon ein Test-Unterordner des Onlineshops.

Wieso sollte ich die von dir genannten Zeilen nicht löschen?

Um zu testen, ob diese Zeilen weiterhin benötigt werden, bzw. ob ein Löschen dieser den Error auslöst, je nachdem was ein Editor mit welchen Einstellungen verwendet wird.

Dass die Datei oder Das Dateiformat falsch ist, denn sonst würde die Datei stets nicht funktionieren.

Wenn ich den von dir geposteten Inhalt in einer .htaccess Datei speicher, löst diese in meiner Testumgebung keinen Serverfehler aus.

Ich ändere ja nur die Datei und speichere diese ab.

Beim Abspeichern kann schon ein falsches Format erzeugt werden. Die .htaccess Datei enthält auch Umlaute:

# dynamisch generiert und sollten nur über WordPress-Filter geändert werden.

Einige Editoren unter Windows speichern in so einem Fall ein (nicht sichtbares) BOM mit ab, welches den Serverfehler auslösen kann:

https://jkip.de/howtos/bom-byte-order-mark

02.05.2020 11:20

10 Sabine (Gast)

Hallo Jörg,
Vielen lieben Dank für deine ganzen Erklärungen!
Beim Ändern der Datei wurde diese in einem falschen Format abgespeichert. Und zwar mit BOM.
Dann dir wurde das Problem gelöst!
Vielen vielen Dank dafür!
Wünsche dir noch eine schöne Woche!
Viele Grüße, Sabine

04.05.2020 16:59

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]