Created
January 4, 2020 00:42
-
-
Save knibals/5b16477e7b76a7b599f7f2161083bf36 to your computer and use it in GitHub Desktop.
The Nginx virtualhost for Drupal sites
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
server { | |
server_name example.com; | |
root /var/www/drupal8; | |
location = /favicon.ico { | |
log_not_found off; | |
access_log off; | |
} | |
location = /robots.txt { | |
allow all; | |
log_not_found off; | |
access_log off; | |
} | |
# Very rarely should these ever be accessed outside of your lan | |
location ~* \.(txt|log)$ { | |
allow 192.168.0.0/16; | |
deny all; | |
} | |
location ~ \..*/.*\.php$ { | |
return 403; | |
} | |
location ~ ^/sites/.*/private/ { | |
return 403; | |
} | |
# Block access to scripts in site files directory | |
location ~ ^/sites/[^/]+/files/.*\.php$ { | |
deny all; | |
} | |
# Allow "Well-Known URIs" as per RFC 5785 | |
location ~* ^/.well-known/ { | |
allow all; | |
} | |
# Block access to "hidden" files and directories whose names begin with a | |
# period. This includes directories used by version control systems such | |
# as Subversion or Git to store control files. | |
location ~ (^|/)\. { | |
return 403; | |
} | |
location / { | |
try_files $uri /index.php?$query_string; | |
} | |
location @rewrite { | |
rewrite ^/(.*)$ /index.php?q=$1; | |
} | |
# Don't allow direct access to PHP files in the vendor directory. | |
location ~ /vendor/.*\.php$ { | |
deny all; | |
return 404; | |
} | |
location ~ '\.php$|^/update.php' { | |
# Ensure the php file exists. Mitigates CVE-2019-11043 | |
try_files $uri =404; | |
fastcgi_split_path_info ^(.+?\.php)(|/.*)$; | |
# Security note: If you're running a version of PHP older than the | |
# latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini. | |
# See http://serverfault.com/q/627903/94922 for details. | |
include fastcgi_params; | |
# Block httpoxy attacks. See https://httpoxy.org/. | |
fastcgi_param HTTP_PROXY ""; | |
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |
fastcgi_param PATH_INFO $fastcgi_path_info; | |
fastcgi_param QUERY_STRING $query_string; | |
fastcgi_intercept_errors on; | |
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; | |
} | |
# Fighting with Styles? This little gem is amazing. | |
location ~ ^/sites/.*/files/styles/ { | |
try_files $uri @rewrite; | |
} | |
# Handle private files through Drupal. Private file's path can come | |
# with a language prefix. | |
location ~ ^(/[a-z\-]+)?/system/files/ { | |
try_files $uri /index.php?$query_string; | |
} | |
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { | |
try_files $uri @rewrite; | |
expires max; | |
log_not_found off; | |
} | |
# Enforce clean URLs | |
# Removes index.php from urls like www.example.com/index.php/my-page --> www.example.com/my-page | |
# Could be done with 301 for permanent or other redirect codes. | |
if ($request_uri ~* "^(.*/)index\.php(.*)") { | |
return 307 $1$2; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment