Puncte:2

NGINX block location access and redirect to custom error page

drapel cn

I have a issue with my NGINX setting with redirecting to a custom error page on another location (incl. css, images, js) if a error page should be thrown.

At first I would like to block access to an folder (like .git). This can be easily done via (inside the server block)

location ~ /(.git) {
    deny all;
    return 404;
}

Then i created a custom error_page element (inside the server block) with a custom 404.html file on a different location than the root directory of the website.

error_page 404 /404.html;
location = /404.html {
    root /var/data/websites/error-page;
    internal;
}

After these changes, my custom 404 page will be shown - but without css, js and images.

If i inspect the website, the reason is simple: the path of the files are wrong - they are based on the location (in my example .git). https://it.dmetzler1988.io/.git/css/main.css net::ERR_ABORTED 404.

Here is the complete NGINX config file for this page (only removed the ssl certificate paths):

server {
    listen 443 ssl;
    listen [::]:443 ssl http2;

    ssl_certificate <path>;
    ssl_certificate_key <path>;

    server_name it.dmetzler1988.io;
    root /var/data/websites/dmetzler1988.io/it.dmetzler1988.io;
    index index.html index.php;

    error_page 404 /404.html;
    location = /404.html {
        root /var/data/websites/error-page;
        internal;
    }

    location ~ /(.git) {
        deny all;
        return 404;
    }
}

So my questions on this place:

  1. How can i fix the issue with the wrong path (remove the .git from path)?
  2. Is this the correct way for such an use case or is there a better solution?
drapel sv
Bun venit la ServerFault. Cel mai bine este să păstrați activele (main.css, main.js etc.) într-un folder separat (cum ar fi în /example-folder/) și apoi să utilizați un bloc de locație suplimentar (`location /example-folder/ { alias "/ path/to/example-folder"; }`) cu rădăcină personalizată sau alias pentru a servi acele fișiere.
Ivan Shatsky avatar
drapel gr
@PothiKalimuthu Soluția dvs. necesită o directivă `alias /path/to/example-folder/` pentru a funcționa corect (rețineți slash-ul final).Fără aceasta, o solicitare precum `/example-folder/css/main.css` ar fi servită ca `/path/to/example-foldercss/main.css`, dându-vă, evident, o eroare `HTTP 404 Not Found`. Am descris acest comportament „alias” [aici](https://stackoverflow.com/a/69296739/7121513).
devKyrios avatar
drapel cn
@IvanShatsky L-am încercat așa cum ați descris-o (am încercat și diverse modificări), dar nu va funcționa pentru css-ul meu (am folosit doar calea css pentru teste). `location ~* /.git/css/.* { root /var/data/websites/error-page/css; }`. E ceva in neregula? Primesc eroarea 404 pentru acest fișier și după adăugarea noii locații.
Ivan Shatsky avatar
drapel gr
@devKyrios Puteți adăuga configurația pe care ați încercat-o ca actualizare la întrebarea dvs.?
devKyrios avatar
drapel cn
@IvanShatsky haha, îmi pare rău, a încetinit editarea. Acum este adăugat. Am încercat cu și fără `/.*` la sfârșit. De asemenea, cu locații sensibile la majuscule și așa mai departe.
devKyrios avatar
drapel cn
@IvanShatsky oh la naiba... îmi pare rău, nu contează - eșecul meu. Nu funcționează cu blocul de locație pe care l-am adăugat ieri ( `location ~ /\.git { return 404; }` ). Am un bloc de locații suprapus. Îmi pare rău.
Puncte:0
drapel gr

În primul rând, despre erorile din configurația dvs.

locație ~ /(.git) { ... }

Se pare că nu sunteți foarte familiarizat cu modelele regex PCRE. Nu este nevoie să folosiți un grup de captură aici - grupurile de captură sunt folosite atunci când veți avea nevoie de conținutul acestuia mai târziu. Cu toate acestea, nu este o eroare critică. Partea cea mai proastă este că utilizați un caracter de puncte neprotejat, care funcționează ca metacaracter în modelele regex. În acest fel, blocați în mod eficient orice URI care conține un șir în care se află caracterele al doilea, al treilea și al patrulea git (de exemplu. /agitation/index.html, /any/prefix/agitation/index.html, etc.) Aici va fi modelul regex corect /\.git (blocarea orice incepand cu .git inclusiv .gitignore, etc. la orice nivel de director imbricat).

În continuare, utilizați două directive în acea locație - nega totul și întoarce 404. Doar unul dintre ele va fi suficient aici - fie nega totul (întorcându-se HTTP 403 Interzis) sau întoarce 404 (întorcându-se HTTP 404 nu a fost găsit). Motivul pentru care primești 404 mai degrabă decât 403 este că întoarcere directivă executată la RESCRIE faza de procesare a cererii în timp ce nega unul executat la mai târziu ACCES faza (fazele de procesare a cererii descrise în ghid de dezvoltare).

Acum revenim la întrebarea ta. Se pare că vă trimiteți materialele folosind căi URI relative, de ex.

<link rel="stylesheet" type="text/css" href="css/main.css">

Unele dintre opțiunile dvs. sunt (dar fără a se limita la):

  • încorporați fiecare material în HTML de gestionare a erorilor (inclusiv imaginile dvs., o puteți face codând imaginile dvs. în BASE64 și folosind URI de date);

  • mutați toate activele în folderul unii de sub rădăcina principală a site-ului dvs. web (să zicem /var/data/websites/dmetzler1988.io/it.dmetzler1988.io/assets/errors și trimiteți-le folosind calea completă:

    <link rel="stylesheet" type="text/css" href="/assets/errors/css/main.css">
    
devKyrios avatar
drapel cn
La început, vă mulțumesc foarte mult pentru feedback-ul util! Cunoștințele mele despre regex în NGINX par să fie greșite. De asemenea, informațiile directivei au fost foarte utile - așa că sunt în siguranță doar cu directiva „return 404”. Ambele idei pentru a rezolva problema surselor ar fi o soluție, dar nu am vrut să dublez codul și îl voi păstra ușor editabil/înțeles (fără codificare base64 și css/js în html). Sper că există o soluție cu modificări la rădăcină, proxy sau similar. Vă mulțumim încă o dată pentru feedback-urile dvs. foarte constructive și utile!!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.