IIS用子文件夹重写SEF Urls

时间:2019-02-20 18:50:05

标签: iis url-rewriting

我四处搜寻,没有任何运气,所以决定是时候问了。

我遇到客户想要SEF网址的情况

www.somesite.com/sef_rewriting

www.somesite.com/foo

工作正常-问题是如果sef_rewriting也可以是目录会发生什么情况?

www.somesite.com/sef_rewriting/removing_file_extensions

如果有人请求以下URL,则IIS将自动添加一个斜杠: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>

任何帮助将不胜感激。

注意:文件和目录的命名方案不能更改。

更新:为清楚起见而编辑

规则必须满足以下条件

  1. www.mysite.com-提供index.html
  2. www.mysite.com/foo-提供foo.html
  3. www.mysite.com/sef_rewriting-提供sef_rewriting.html
  4. www.mysite.com/sef_rewriting/removing_file_extensions-服务 removal_file_extensions.html

2 个答案:

答案 0 :(得分:0)

根据您的描述,我建议您可以使用以下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>

结果: https://developers.line.biz/en/docs/

但是在网址中输入站点名称后,该站点将无法正常工作。

我建议您也可以在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> 

答案 1 :(得分:0)

在许多人的帮助下,我有了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是否存在,如果可以,则为您服务。