<div dir="ltr">Hi,<div><br></div><div>I am running the Nginx version: nginx/1.16.1 on CentOS Linux release 7.8.2003 (Core). I am trying to forbid/prevent web.config file to download it from the browser. When I hit</div><div><a href="https://mydomain.com/web.config">https://mydomain.com/web.config</a> it is allowing me to download instead of forbidding the page ( 403 Forbidden). I am sharing the below nginx.conf file for your reference. </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">server {<br>    server_name _;<br>    root /var/www/html/apcv3/docroot; ## <-- Your only path reference.<br>    location /dacv3 {<br>        alias /var/www/html/apcv3/docroot;<br>        index index.php;<br>    location ~ \.php$ {<br>    include fastcgi_params;<br>        # Block httpoxy attacks. See <a href="https://httpoxy.org/">https://httpoxy.org/</a>.<br>        fastcgi_param HTTP_PROXY "";<br>        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br>        fastcgi_param PATH_INFO $fastcgi_path_info;<br>        fastcgi_param QUERY_STRING $query_string;<br>        fastcgi_intercept_errors on;<br>        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;<br>    }<br>}<br>    location = /favicon.ico {<br>        log_not_found off;<br>        access_log off;<br>    }<br>    location = /robots.txt {<br>        allow all;<br>        log_not_found off;<br>        access_log off;<br>    }<br>    # Very rarely should these ever be accessed outside of your lan<br>    location ~* \.(txt|log)$ {<br>        allow <a href="http://192.168.0.0/16">192.168.0.0/16</a>;<br>        deny all;<br>    }<br>    location ~ \..*/.*\.php$ {<br>        return 403;<br>    }<br>    location ~ ^/sites/.*/private/ {<br>        return 403;<br>    }<br>    # Block access to scripts in site files directory<br>    location ~ ^/sites/[^/]+/files/.*\.php$ {<br>        deny all;<br>    }<br>    # Allow "Well-Known URIs" as per RFC 5785<br>    location ~* ^/.well-known/ {<br>        allow all;<br>    }<br>    # Block access to "hidden" files and directories whose names begin with a<br>    # period. This includes directories used by version control systems such<br>    # as Subversion or Git to store control files.<br>    location ~ (^|/)\. {<br>        return 403;<br>    }<br>    location / {<br>        # try_files $uri @rewrite; # For Drupal <= 6<br>        try_files $uri /index.php?$query_string; # For Drupal >= 7<br>    }<br>    location @rewrite {<br>        rewrite ^/(.*)$ /index.php?q=$1;<br>    }<br>    # Don't allow direct access to PHP files in the vendor directory.<br>    location ~ /vendor/.*\.php$ {<br>        deny all;<br>        return 404;<br>    }<br>    # Protect files and directories from prying eyes.<br>    location ~* \.(engine|inc|install|make|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\.(?!well-known).*|Entries.*|Repository|Root|Tag|Template|composer\.(json|lock)|web\.config)$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig|\.save)$ {<br>        deny all;<br>        return 404;<br>    }<br>    location ^~ /web.config {<br>            deny all;<br>        }<br>    # In Drupal 8, we must also match new paths where the '.php' appears in<br>    # the middle, such as update.php/selection. The rule we use is strict,<br>    # and only allows this pattern with the update.php front controller.<br>    # This allows legacy path aliases in the form of<br>    # blog/index.php/legacy-path to continue to route to Drupal nodes. If<br>    # you do not have any paths like that, then you might prefer to use a<br>    # laxer rule, such as:<br>    #   location ~ \.php(/|$) {<br>    # The laxer rule will continue to work if Drupal uses this new URL<br>    # pattern with front controllers other than update.php in a future<br>    # release.<br>    location ~ '\.php$|^/update.php' {<br>        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;<br>        # Security note: If you're running a version of PHP older than the<br>        # latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini.<br>        # See <a href="http://serverfault.com/q/627903/94922">http://serverfault.com/q/627903/94922</a> for details.<br>        include fastcgi_params;<br>        # Block httpoxy attacks. See <a href="https://httpoxy.org/">https://httpoxy.org/</a>.<br>        fastcgi_param HTTP_PROXY "";<br>        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br>        fastcgi_param PATH_INFO $fastcgi_path_info;<br>        fastcgi_param QUERY_STRING $query_string;<br>        fastcgi_intercept_errors on;<br>        # PHP 5 socket location.<br>        #fastcgi_pass unix:/var/run/php5-fpm.sock;<br>        # PHP 7 socket location.<br>        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;<br>    }<br>    # Fighting with Styles? This little gem is amazing.<br>    # location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6<br>    location ~ ^/sites/.*/files/styles/ { # For Drupal >= 7<br>        try_files $uri @rewrite;<br>    }<br>    # Handle private files through Drupal. Private file's path can come<br>    # with a language prefix.<br>    location ~ ^(/[a-z\-]+)?/system/files/ { # For Drupal >= 7<br>        try_files $uri /index.php?$query_string;<br>    }<br>    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {<br>        try_files $uri @rewrite;<br>        expires max;<br>        log_not_found off;<br>    }<br>}</blockquote><div><br></div><div>Please let me know if I am missing anything in the Nginx config file. Thanks in advance and I look forward to hearing from you. <br></div><div><br></div><div>Best Regards,</div><div><br></div><div>Kaushal</div><div> </div></div>