it-swarm-eu.dev

Apache RewriteRule nepřesměruje

Mám to v mém _ .htaccess souboru:

RewriteEngine on

RewriteRule ^images/chart\.png$    /static/images/chart.png    [L,R=301]
RewriteRule ^images/artwork/(.+).png   /static/artwork/$1.jpg  [L,R=301]

# codeigniter
RewriteCond $1 !^(index\.php|static|images|admin|user_guide|sitemap\.xml\.gz|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

Část CodeIgniter by měla ignorovat složky images a static. Když však otevřu example.com/images/chart.png, dostanu stránku CI 404. Další přesměrování 301 funguje dobře.

Nemůžeš to pochopit, má někdo tušení?

3
DisgruntledGoat

Nakonec se mi to podařilo opravit odstraněním adresáře images z klauzule CI RewriteCond. (Stále si není stoprocentně jistý, proč to fungovalo, protože žádost o images/chart.png se neměla ani dostat do části CI.)

0
DisgruntledGoat

Zde se děje to, že vaše přepisování skutečně funguje, ale R = 301 způsobuje druhou iteraci, která způsobuje 404.

Žádost přichází pro images/chart.png a vaše pravidla přepisování fungují. Když se shoduje s vaším prvním pravidlem, způsobí přesměrování 301. Toto přesměrování 301 říká prohlížeči, aby vydal nová žádost pro /static/images/chart.png.

Nový požadavek se tak dostane na váš server a pravidla pro přepisování budou provedena znovu. Tentokrát požadavek neodpovídá vašim vlastním pravidlům v horní části a činí jej z pravidla CodeIgniter. Protože vaše nová adresa URL začíná „statickým“, odpovídá pravidlu CI a přesměruje na /index.php?/static/images/chart.png. Protože CI nemá tušení, jak to zvládnout (předpokládám), vyhodí 404, aby informovala uživatele, že nemůže najít zdroj.

Chystáte se aktualizovat pravidlo CI a přidat následující podmínky:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

To řekne mod_rewrite, aby provedl pravidlo, pouze pokud požadavek není pro doslova existující soubor (!-f) nebo adresář (!-d).

Jakmile je tato aktualizace provedena, první pravidlo způsobí stejné přesměrování pro /static/images/chart.png, ale protože tento soubor doslova existuje na této cestě, pravidla CI jej ponechají samotná a nebude provedeno žádné nové přepisování. Server poté bude normálně zobrazovat obraz.

0
AgentConundrum