web-dev-qa-db-ja.com

IIS7.5のURL書き換え問題

私の目的は、IIS 7.5でホストされているWebサイトのフレンドリURLを作成することです。

このサイトには、次のURLを持つ3つのページがあります。

  • http://www.example.com/contact.php?langid=1&title=contact
  • http://www.example.com/technology.php?langid=1&title=technology
  • http://www.example.com/clients.php?langid=1&title=clients

この形式のURLが欲しい:

  • http://www.example.com/1/contact/
  • http://www.example.com/1/technology/
  • http://www.example.com/1/clients

IISウィザードでわかりやすいURLを作成すると、同じURLパターンが使用されます

^([^/]+)/([^/]+)/?$

ルールごとに。これは、3つのURLすべてが同じページにリダイレクトすることを意味します。

web.configファイルは次のようになります。

    <?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
            <rule name="RedirectUserFriendlyURL1" stopProcessing="true">
                    <match url="^clients\.php$" />
                    <conditions>
                        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
                        <add input="{QUERY_STRING}" pattern="^langid=([^=&amp;]+)&amp;title=([^=&amp;]+)$" />
                    </conditions>
                    <action type="Redirect" url="{C:1}/{C:2}" appendQueryString="false" />
                </rule>
                <rule name="RewriteUserFriendlyURL1" stopProcessing="true">
                    <match url="^([^/]+)/([^/]+)/?$" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="clients.php?langid={R:1}&amp;title={R:2}" />
                </rule>
                <rule name="RedirectUserFriendlyURL2" stopProcessing="true">
                    <match url="^contact\.php$" />
                    <conditions>
                        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
                        <add input="{QUERY_STRING}" pattern="^langid=([^=&amp;]+)&amp;title=([^=&amp;]+)$" />
                    </conditions>
                    <action type="Redirect" url="{C:1}/{C:2}" appendQueryString="false" />
                </rule>
                <rule name="RewriteUserFriendlyURL2" stopProcessing="true">
                    <match url="^([^/]+)/([^/]+)/?$" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="contact.php?langid={R:1}&amp;title={R:2}" />
                </rule>
</rules>
            <outboundRules>
                <clear />
                <rule name="OutboundRewriteUserFriendlyURL1" preCondition="ResponseIsHtml1">
                    <match filterByTags="A, Form, Img" pattern="^(.*/)clients\.php\?langid=([^=&amp;]+)&amp;(?:amp;)?title=([^=&amp;]+)$" />
                    <action type="Rewrite" value="{R:1}{R:2}/{R:3}/" />
                </rule>
                <rule name="OutboundRewriteUserFriendlyURL2" preCondition="ResponseIsHtml1">
                    <match filterByTags="A, Form, Img" pattern="^(.*/)contact\.php\?langid=([^=&amp;]+)&amp;(?:amp;)?title=([^=&amp;]+)$" />
                    <action type="Rewrite" value="{R:1}{R:2}/{R:3}/" />
                </rule>
                <preConditions>
                    <preCondition name="ResponseIsHtml1">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
        <urlCompression doDynamicCompression="false" />
    </system.webServer>
</configuration>

これを正しく行う方法はありますか?

2
Dog

問題は、同じファイル名を使用するようにアクションがハードコーディングされていることです。いくつかの条件を追加してルールを複製することもできますが、より簡単なオプションはRewriteUserFriendlyURL2アクションURLを次のように変更することです。

{R:2}.php?langid={R:1}&amp;title={R:2}

titleパラメーターが常にファイル名と等しい場合。

1