Încerc să configurez o structură de directoare într-un site web IIS cu reguli de rescriere care se aplică la diferite niveluri. De exemplu, luați în considerare următoarea structură:
Site Web implicit
ââ web.config
ââ v1
ââ web.config
ââ wwwroot
ââ salut.txt
Vreau să pot accesa salut.txt
prin http://localhost/hello.txt. Am configurat web.config
la nivelul rădăcină a site-ului web astfel:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite to v1" stopProcessing="false">
<match url="^(?!v1).*" />
<action type="Rewrite" url="v1\{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Și am configurat web.config
în v1
director ca acesta:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite to wwwroot" stopProcessing="false">
<match url="^(?!wwwroot).*" />
<action type="Rewrite" url="wwwroot\{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Rescrierea cu un singur nivel funcționează când accesez http://localhost/v1/hello.txt, dar rescrierea pe două niveluri nu funcționează pentru http://localhost/hello.txt. Pagina de eroare IIS arată că cererea încă se rezolvă la calea fizică â¦\v1\hello.txt
Decat â¦\v1\wwwroot\hello.txt
; vedea https://i.stack.imgur.com/KjdH5.png. Rețineți că schimbarea rescrierilor în redirecționări permite ca fișierul să fie servit cu succes.
Există o modalitate de a face acest lucru să funcționeze sau este o limitare a modulului de rescriere a URL-ului? Microsoft pare să susțină că acest lucru este acceptat în Referință de configurare a modulului de rescriere URL:
Reguli Moștenirea
Dacă regulile sunt definite pe mai multe niveluri de configurare, modulul de rescriere URL evaluează regulile în următoarea ordine:
- Evaluează toate regulile globale.
- Evaluați un set de reguli care include reguli distribuite de la nivelurile de configurare părinte, precum și reguli de la nivelul de configurare curent. Evaluarea se efectuează într-o ordine de la părinte la copil, ceea ce înseamnă că regulile părinte sunt evaluate mai întâi, iar regulile definite la nivelul ultimului copil sunt evaluate ultimele.
Sunt conștient că pot face web.config
la nivelul rădăcinii site-ului, faceți referire la interior wwwroot
director direct (prin url="v1\wwwroot\{R:0}"
). Totuși, nu vreau să fac asta. În cele din urmă voi extinde exteriorul web.config
pentru a suporta alte versiuni (v2
, v3
, â¦), care poate avea sau nu și a wwwroot
subdirector, deci ar fi mult mai curat să mențineți orice rescrie specifice versiunii în subdirectoarele interioare din subdirectoarele specifice versiunii web.config
.
Am încercat să folosesc urmărirea cererilor eșuate. Regula exterioară, Rescrie la v1
, este înregistrat pentru a rula cu succes. Nu există nicio mențiune despre regula interioară, Rescrie pe wwwroot
.