Setup & config options
Apache 2.4+ LAMP server
The game & not the islands
Setup & config options
North Atlantic : Macaronésia
Nine Azorean islands🚫 No ads & tracking
Most of the articles, descriptions and instructions written here are applicable to the most common Debian-based Linux derivatives. Depending on the respective operating system, there may be minor or major discrepancies.
This website is for educational purposes only. Please do not deploy anything in manufacturing plants.
No warranty or compensation is given for loss of data or hardware.
It should be also mentioned that this modest web server is hosted on a Raspberry Pi type 4B at home.
Raspberry Pi is a series of small single-board computers (SBCs) developed in the United Kingdom by the Raspberry Pi Foundation in association with Broadcom. The mini-computer with its armv7l processor has quickly become the favourite of hobbyists. Projects can be started with suitable Linux distributions. Even an aged RasPi e.g. the models 2B and 2B+ can definitely serve to simple tasks quite well.
First you should consider which codes make sense and which can be skipped. Otherwise, it can result in some unpleasant surprises.
Apache httpd 2.2 is End-of-Life since December 2017 and should not be used. Users are advised to upgrade to the currently supported released version to address known issues.
root@raspberry:# apache2 -v
Server version: Apache/2.4+.53 (Raspbian) Server built: 2022-03-14T16:28:35
You can create one by renaming a simple text document and giving it the name ».htaccess«.
Upload this text document to root e.g. /var/www/html/
.
chmod
the ».htaccess« file to 644 or (rw-r–r–) so that the file is usable by apache and prevents it from being read by a web browser.user@raspberry:~ $ sudo su
root@raspberry:# cd /var/www/html
root@raspberry:/var/www/html# chmod 644 .htaccess
To make ».htaccess« working as expected, you need to edit the apache configuration file:
root@raspberry:~# nano /etc/apache2/apache2.conf
<Directory /var/www/> ... AllowOverride None ... </Directory> <Directory /var/www/> ... AllowOverride All ... </Directory>
Save Ctrl O the file apache2.conf
and close Ctrl X the nano editor.
root@raspberry:~# service apache2 restart
root@raspberry:~# systemctl daemon-reload
root@raspberry:~# service apache2 restart
# Apache v2.2 Order, Allow, Deny # Apache v2.4+ Require all granted Require all denied Require not ip Require not host # Apache v2.2 RewriteCond %{http_USER_AGENT} zgrab RewriteCond %{http_REFERER} (facebook|twitter|amazon) # Apache v2.4+ RewriteCond "%{http_USER_AGENT}" "zgrab" RewriteCond "%{http_REFERER}" "(facebook|twitter|amazon)"
# Charset and language AddDefaultCharset UTF-8 DefaultLanguage en # Disable directory browsing Options -Indexes +FollowSymLinks # Hide the server's OS and port opened in error message pages ServerSignature Off # Apache module mod_rewrite must be turned on. Read below. RewriteEngine on # Error handling, redirecting to a specific html-file or ext. domain # 404 Not Found, 403 Access Forbidden, 410 Gone ErrorDocument 403 https://duck.com/ ErrorDocument 404 /path_to/404.html ErrorDocument 410 Default # Entire directoy Redirect 410 /gone # Single file Redirect 410 /gone.html # AddType associates a mime type with a given extension # Has no infuence with modern web browsers. You may skip all. AddType audio/mp3 .mp3 AddType audio/mp3 .wav AddType audio/ogg .ogg AddType audeo/webm .webm AddType image/x-icon .ico AddType video/mp4 .mp4 AddType video/mp4 .m4v AddType video/webm .webm
If one criteria matches, Apache sends a 403 »Access Forbidden« response.
<RequireAll> Require all granted Require not ip 101.202.303.404 Require not ip 101.202.303 Require not ip 101.202 Require not host example.com Require not host sub.example.com Require not host sub.example Require not host example Require not host exit Require not host tor </RequireAll> <RequireAll> Require all granted Require not ip 101.202.303.404 101.202.303 101.202 Require not host example.com sub.example.com sub.example example Require not host exit tor </RequireAll>
Study the source : https://httpd.apache.org/docs/2.4+/howto/access.html
Never ever use the .co (Colombia) domain, otherwise you block everthing for .co, *.co.* AND .com !
RewriteEngine on RewriteCond "%{http_USER_AGENT}" "(zgrab|googlego)$" [NC,OR] RewriteCond "%{http_REFERER}" "^.*(ru|ua|io).*$" [NC] RewriteRule "(.*)" "-" [F] RewriteCond "%{http_USER_AGENT}" "(YandexBot|SemrushBot)$" [NC,OR] RewriteCond "%{http_REFERER} "^.*(ru|ua|cn|by).*$" [NC,OR] RewriteCond "%{http_REFERER} "(facebook|twitter|youtube)$" [NC] RewriteRule "(.*)" "-" [F]
# some Googlebots run under Chrome/11.x # some Googlebots run under Chrome/49.x, 41.x # Googlebots run with Android 6.0 # Bing's BingPreview bots run in NT 6.1 (Windows 7) RewriteCond "%{HTTP_USER_AGENT}" "(MSIE [5-9]|MSIE 10)" [NC,OR] RewriteCond "%{HTTP_USER_AGENT}" "(NT [5-6].[2])" [NC,OR] RewriteCond "%{HTTP_USER_AGENT}" "(Chrome/[2-3]|Chrome/4[2-8]|Chrome/[5-8])" [NC,OR] RewriteCond "%{HTTP_USER_AGENT}" "(Firefox/[2-9]|Firefox/9.0)" [NC,OR] RewriteCond "%{HTTP_USER_AGENT}" "(Opera/[2-7])" [NC,OR] RewriteCond "%{HTTP_USER_AGENT}" "(Android [2-5|Android [7-9])" [NC,OR] RewriteCond "%{HTTP_USER_AGENT}" "^(Mozilla)$" [NC,OR] RewriteCond "%{HTTP_USER_AGENT}" "(Mozilla/4|Mozilla/6)" [NC] RewriteRule "(.*)" "-" [F]
About the RewriteEngine on
this requires to activate the »mod_rewrite« module.
How to enable »mod_rewrite« if not yet already :
root@raspberry:~# a2enmod rewrite
Module rewrite (already) enabled
root@raspberry:~# service apache2 restart
Reloads all the Apache config files.
Or as per new unified system control way:
root@raspberry:~# systemctl restart apache2
How to disable php, php5, Perl, CGI execution, if needed :
RewriteRule "^.*\.(php|php5|pl|cgi)$" "-" [F]
Alternative can be used
<FilesMatch "\.(php|php5|pl|cgi)$"> Require all denied </FilesMatch>
How to allow only certain request method :
RewriteCond "%{REQUEST_METHOD}" "!(GET|HEAD|POST)" RewriteRule "(.*)" "-" [F]
Alternative can be used
<RequireAny> Require method GET HEAD POST </RequireAny>
16-Jan 2018
Updated 11-Jul 2022
This depends on your domain package and support purchased. Point out that without the »www.« it simply not always necessary. Neither is better than the other. But it is recommended that you use only one format. Either of the format is equally good. Without »www.« all URLs are shorter, easier to read and quicker to type.
root@raspberry:# nano /var/www/html/.htaccess
Implement this snippet beyond of others on top of the ».htaccess« file.
... RewriteEngine on Options +FollowSymLinks ... RewriteCond %{HTTPS} Off [OR] RewriteCond "%{HTTP_HOST}" "^www\.example\.com$" [NC] RewriteRule (.*) "https://example.com/$1" [R=308,L] ...
Please note that this code may cause the renewal / prolongation of the SSL certificate to fail.
The same for »http://www.« if only supported.
... RewriteCond "%{HTTP_HOST}" "^www\.example\.com$" [NC] RewriteRule (.*) "http://example.com/$1" [R=308,L] ...
08-Apr 2018
Updated 26-Jun 2022
A good idea has to let the visitor knowing what occured exactly.
Not every HTML-tag is permitted like the CSS style tags. HTML5 code rules out totally.
Watch out the quotation marks with "<html>
and </html>"
.
root@raspberry:# nano /var/www/html/.htaccess
REMOVE ALL line breaks & white spaces after 403 "<html>
or you get »500 Internal Server Error«.
Only the following tags are allowed.
<html>
<head>
<title>
<body>
<p>
<br>
<hr>
<ul>
<li>
ErrorDocument 403 "<html> <head> <title>403 Access Forbidden</title> </head> <body> <br><hr><h2>403 Access Forbidden</h2> <p>You don't have permission to access this resource.</p> <p>There are at least seven possible reasons :</p> <p> <ul> <li>Are you using an outdated web browser? <br>Upgrade your web browser to the most recent version to improve the surf experience.</li> <br><li>A blank User-Agent string.</li> <li>Index file browsing is forbidden.</li> <li>A firewall denies the permission.</li> <li>The server's geotargeting feature does not allow any access.</li> <li>You are not a human being, you are an unwished web-robot.</li> <li>You come from a remote host rejected by the server configuration.</li> </ul> </p><br> <hr> </body> </html>"
08-Feb 2021