Ich habe mir jetzt deine web.config Datei mal genauer anngeschaut:
- Sie überschreitet die 250 KB Grenze
- Daher der Serverfehler 500.
- 95% der Datei besteht aus Rewrite-Regeln, fast alle davon sind überflüssig.
- Die Menge der Regeln führt unweigerlich zu erheblichen Performance-Problemen. Denn bevor der Webserver den eigentlichen Request verarbeiten kann, muss er zwangsweise alle Regeln evaluieren, und da sind sehr viele!
Zwei Dinge können/müssen jetzt gemacht werden:
- Die Regeln entschlacken, und
- sie in eine externe config-Datei auslagern (raus aus der web.config)
1.) Regeln entschlacken:
1.a: Regel-Definitionen verkürzen
Original:
<rule name="http://www.yogisan-shop.com/fuellmaterial/dinkelspelzen/index.html nach http://www.yogisan-shop.com/dinkelspelzen-dinkelspreu-aus-kontrolliert-biologischem-anbau" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(www.)?yogisan-shop.com" />
<add input="{REQUEST_URI}" pattern="fuellmaterial/dinkelspelzen/index.html(.*)" />
</conditions>
<action type="Redirect" url="http://www.yogisan-shop.com/dinkelspelzen-dinkelspreu-aus-kontrolliert-biologischem-anbau" />
</rule>
Neu:
<rule name="fuellmaterial/dinkelspelzen/index.html nach dinkelspelzen-dinkelspreu-aus-kontrolliert-biologischem-anbau" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{REQUEST_URI}" pattern="fuellmaterial/dinkelspelzen/index.html(.*)" />
</conditions>
<action type="Redirect" url="/dinkelspelzen-dinkelspreu-aus-kontrolliert-biologischem-anbau" />
</rule>
Der Domainname kann grundsätzlich ausgelassen werden, er leitet sich eh autom. vom angeforderten Hostnamen ab. Die erste Bedingung (<add input="{HTTP_HOST}"... />) kann demzufolge auch weg. Dieser Vorgang, angewandt auf alle Regeln, spart womöglich bis zu 20% Dateiumfang ein.
1.b: Rewrite-Maps (statt -Rules)
Alle Quell/Ziel-Mappings lassen sich auch in viel verkürzterer Form im rewriteMap-Element definieren. Eine einzelne Regel (Rule) sorgt dann dafür, dass die passende Ziel-URL aus dem Map ermittelt wird. Diese Umstellung dürfte den Dateiumfang erheblich reduzieren und für deutlich mehr Performance sorgen. Und da das hier kein Forum für IIS Best-Practices ist, hier die entpr. Lektüre zum Lesen: Creating Rewrite Maps (leider englisch).
2.) Regeln auslagern
Zwei neue Dateien anlegen:
- Config/RewriteMaps.config
- Config/RewriteRules.config
Config/RewriteMaps.config:
<?xml version="1.0" encoding="utf-8"?>
<rewriteMaps>
<rewriteMap name="MyRewriteMap">
<add key="Quelle.html" value="/Ziel" />
...
</rewriteMap>
</rewriteMaps>
Config/RewriteRules.config:
<rules>
<clear />
... alle (verkürzten) Regeln aus Web.Config hier rein
</rules>
Web.Config dahingehend anpassen, dass die Regeln auch aus den zuvor angelegten Dateien ausgelesen werden:
...
<rewrite>
<rewriteMaps configSource="Config\RewriteMaps.config" />
<rules configSource="Config\RewriteRules.config" />
</rewrite>
...
Das Verwalten von Regeln über den IIS (oder sonst einem Web-basierten Tool, das der Hoster hierfür zur Verfügung stellt), führt fortan auch dazu, dass eben diese beiden Dateien aktualisiert werden, und nicht mehr die Web.Config. Ab Version 2.1.1 ist das im Übrigen Standard, wir greifen hier lediglich vor.