IIS переписать SEF URL-адреса с подпапками - PullRequest
0 голосов
/ 20 февраля 2019

Я довольно долго искал безуспешно, поэтому решил, что пришло время спросить.

У меня есть ситуация, когда клиенту нужны URL SEF

www.somesite.com/sef_rewriting

www.somesite.com/foo

работает нормально - проблема в том, что произойдет, если sef_rewriting также может быть каталогом?

www.somesite.com/sef_rewriting/removing_file_extensions

IIS автоматически добавитзавершающий слеш, если кто-то запрашивает следующий URL: www.somesite.com/sef_rewriting и перенаправляет в подкаталог.

например Структура

>wwwroot
    -index.html
    -foo.html
    -sef_rewriting.html
    >sef_rewriting
         -removing_file_extensions.html

Как создать правило, чтобы проверить,запрашиваемый URL-адрес без расширения соответствует файлу с указанным расширением, скажем, в этом случае (html) и обслуживает этот файл, и только если файл не существует, IIS перенаправляет в подкаталог?

Я обнаружил следующееправило онлайн, оно работает для основного случая, но не для подкаталогов с тем же именем, что и у файлов.

<rule name="SEF REWRITE html">
    <match url=".*" negate="false" />
    <conditions>
        <add input="{URL}" pattern="(/[^.]*|\.(html))$" />
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="{C:0}.html" />
</rule>

любая помощь приветствуется.

примечание: схема именования файлов и каталогов можетне подлежит изменению.

UPDATE: отредактировано для ясности

Правила должны обрабатывать следующие условия

  1. www.mysite.com - serve index.html
  2. www.mysite.com / foo - служить1046 *

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я с помощью многих людей и мастера импорта htaccess (даже не подозревал, что он существует!) Ответил на мой собственный вопрос.

<rule name="SEF RULE 1" stopProcessing="true">
    <match url="^(.*)$" ignoreCase="false" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}.html" matchType="IsFile" ignoreCase="false" />
    </conditions>
    <action type="Rewrite" url="{R:1}.html" />
</rule>
<rule name="SEF Rule 2" stopProcessing="true">
    <match url="^(.*)$" ignoreCase="false" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}/index.html" matchType="IsFile" ignoreCase="false" />
    </conditions>
    <action type="Rewrite" url="{R:1}/index.html" />
</rule>

Правило 1: проверяет наличиефайл с определенным расширением, если он существует, он обслуживает этот файл

Правило 2: проверяет, существует ли файл «по умолчанию» при запросе каталога, например, www.mysite.com/ проверит, если www.mysite.com/index.html существует, и если да, подайте это.

0 голосов
/ 22 февраля 2019

Согласно вашему описанию, я предлагаю вам воспользоваться приведенным ниже правилом перезаписи URL.

<system.webServer>
    <rewrite>
        <rules>
          <rule name="SEF REWRITE html" >
            <match url=".*" />
            <conditions  logicalGrouping="MatchAll" trackAllCaptures="false" >
              <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            </conditions>
            <action type="Rewrite" url="{R:0}.html" />
          </rule>
        </rules>
    </rewrite>
</system.webServer>

Результат: enter image description here

Но введите имя сайта в полеURL-адрес, сайт не будет работать.

Я предлагаю также добавить ниже URL-адрес переписать, чтобы установить страницу индекса.

<rule name="showindex" stopProcessing="true">
   <match url=".*"/>
      <conditions>
         <add input="{HTTP_HOST}" pattern="^([a-z]+[.]com)$"/>
      </conditions>
         <action type="Rewrite" url="http://www.{C:0}/{R:0}/index.html" redirectType="Permanent"/>
</rule> 
...