Apache HTTP Server: Difference between revisions

 
(18 intermediate revisions by the same user not shown)
Line 1: Line 1:
==VirtualHost==
A basic virtualhost looks like this
<pre>
<VirtualHost *:80>
  ServerName my_server.com
  ServerSignature Off
  DocumentRoot "/www/example2"
</VirtualHost>
</pre>
{{hidden | Full VirtualHost |
The following virtual host has an HTTPS redirect and uses an LetsEncrypt ssl certificate
<pre>
# contents of /etc/apache2/sites-available/davidl_me.conf
<VirtualHost *:80>
  ServerName www.davidl.me
  ServerAlias davidl.me
  ServerSignature Off
  RewriteEngine on
  RewriteCond %{HTTPS} !=on
  RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [NE,R,L]
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
  ServerName www.davidl.me
  ServerAlias davidl.me
  ServerSignature Off
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/davidl_me/public
  ErrorLog ${APACHE_LOG_DIR}/davidlme_error.log
  CustomLog ${APACHE_LOG_DIR}/davidlme_access.log combined
  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/www.davidl.me/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/www.davidl.me/privkey.pem
</VirtualHost>
</IfModule>
<Directory /var/www/davidl_me/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</pre>
}}
;Notes
* You can have multiple server aliases in one line:
*: E.g. <code>ServerAlias cloud.davidl.me.local cloud.davidl.local</code>


==Compression==
==Compression==


==HTTPS Redirect==
 
 
==Redirects==
===Universal Redirect===
<pre>
RedirectMatch ^(.*)$ https://davidl.me/
</pre>
 
===HTTPS Redirect===
<pre>
<pre>
<VirtualHost *:80>
<VirtualHost *:80>
Line 25: Line 88:
* <code>mod_proxy_wstunnel</code> for websockets
* <code>mod_proxy_wstunnel</code> for websockets
<pre>
<pre>
  RewriteEngine on
  RewriteCond %{HTTP:Upgrade} =websocket
  RewriteRule /(.*)    ws://192.168.1.99/$1  [P,L]
  RewriteCond %{HTTP:Upgrade} !=websocket
  RewriteRule /(.*)    http://192.168.1.99/$1 [P,L]
   ProxyPreserveHost On
   ProxyPreserveHost On
   ProxyRequests Off
   ProxyRequests Off
Line 34: Line 102:
   ProxyPass "/wss2/" "wss://echo.websocket.org/"
   ProxyPass "/wss2/" "wss://echo.websocket.org/"
</pre>
</pre>
;Notes
* If you're proxying to an https url (e.g. <code>https://192.168.1.40/</code>, you will need to add <code>SSLProxyEngine on</code>
** Furthermore, your https url will need to have a valid certificate for the domain you're proxying.
==.htaccess==
<code>.htaccess</code> allows modifying selected Apache configurations on a per-folder basis.<br>
To enable this feature, add <code>AllowOverride All</code> to your <code>apache.conf</code> for the directories you want to allow .htaccess files.
==Headers==
Enable mod_headers with <code>sudo a2enmod headers</code>. 
Then you can add headers to your virtualhost:
<pre>
<VirtualHost *:80>
  #...
  # Prevents caching by search engines (Google)
  Header set X-Robots-Tag: noindex
</VirtualHost>
</pre>
==Access Control==
See [https://httpd.apache.org/docs/2.4/howto/access.html Access Control]. 
See [https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html Require directivies].
Access restictions can be placed in <code>.htaccess</code> files or config files. 
They should always be placed within a directory or location element.
To only allow lan access on a specific virtualhost:
<pre>
<VirtualHost *:80>
  #...
  <Location />
    Require ip 192.168.1.1/24
  </Location>
</VirtualHost
</pre>
Common restrictions:
* <code>Require all granted</code> and <code>Require all denied</code>
* <code>Require local</code> localhost only
;Note
* <code>Allow</code>, <code>Deny</code>, and <code>Order</code> are deprecated. They still work but you shouldn't add them to new code.
==HTTP2==
[https://helgeklein.com/blog/2018/11/enabling-http-2-in-apache-on-ubuntu-18-04/ Guide] 
[https://tools.keycdn.com/http2-test Test website]