Allwe
Allwe

Reputation: 481

IIS Redirect all request on root

I have reactjs application with react router. I dont want to use hash history and I encountered the issue with refreshing page creating 404 error (react-router is not loaded when refreshing and browser wants to fetch non-existent content thus 404). I found some solution and I want to redirect every request to root so server always fetch index.html with import tags first.

My folder structure is simple:

ROOT/
-- index.html
-- static/
   -- js/
      -- main.js
-- css/
etc...

I have this web.config rule found on this site:

<rewrite>
    <rules>
        <rule name="redirect all requests" stopProcessing="true">
            <match url="^(.*)$" ignoreCase="false" />
            <conditions logicalGrouping="MatchAll">
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
            </conditions>
            <action type="Rewrite" url="index.html" appendQueryString="true" />
        </rule>
    </rules>
</rewrite>

This works very fine with URLs on first folder path, I mean all request like /items, /contact are good. But requests like /items/detail are broken because browser is looking into items folder and not into document root. Also very important thing is that my webpack generate index.html script tags in this manner: <script type="text/javascript" src="./static/js/main.js">.

Is it possible that src attribute is wrong because of that ./? How can I tell server (IIS 10) "hey don't look anywhere else but into document root?"

Thanks guys.

Upvotes: 2

Views: 1781

Answers (1)

This is a solution I found were I have some paths I still want to handle by my IIS but the rest I want react to take care.

<configuration>
       <system.webServer>
           <rewrite>
               <rewriteMaps>
                   <rewriteMap name="^(.*)$" />
               </rewriteMaps>
               <rules>
                   <rule
                      name="redirect all requests"
                      stopProcessing="true"
                   >
                       <match url="^(.*)$" />
                       <conditions logicalGrouping="MatchAll">
                           <add
                              input="{REQUEST_URI}"
                              pattern="/someOtherResourceIstillWantIIStoHandle(.*)$"
                              negate="true"
                           />

                           <add
                              input="{REQUEST_FILENAME}"
                              matchType="IsFile"
                              negate="true"
                           />
                            <add
                              input="{REQUEST_URI}"
                              pattern="/resourcecentre(.*)$"
                              negate="true"
                           />
                       </conditions>
                       <action type="Rewrite" url="/index.html" />
                   </rule>
               </rules>
           </rewrite>
       </system.webServer>
    </configuration>

Upvotes: 3

Related Questions