I'm currently in the process of moving our hosting services from one provider to another; although some parts of cyotek.com infrastructure runs on Microsoft Azure, a fair chunk uses more traditional hosting. Our MantisBT instance is one such service that I recently migrated.

Previously the instance was hosted on Linux, now it's on Windows. The initial migration seemed to have gone well and so I'd moved onto the next sub-domain on the list.

This morning however I noticed the error logs were listing that cyotek.com wasn't able to display product road maps. On testing, I was getting 404 responses for any calls to the REST API on the migrated MantisBT instance.

Apache Redirects

The REST API in MantisBT makes use of Apache's mod_rewrite module to rewrite any URI to /api/rest/ to /api/rest/index.php using the following rules in .htaccess

bat
# Based on Slim Framework recommendation @ http://docs.slimframework.com/routing/rewrite/
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

Of course, IIS doesn't support .htaccess files and so these rewrites never occur, hence the 404.

Redirecting in IIS

IIS has its own version of mod_rewrite, the URL Rewrite module, although it isn't installed by default. You can find how to install this module in a previous post.

Once installed, you can add rewrite rules to web.config either via the IIS Manager GUI, or by directly editing the configuration - this post will cover both approaches.

Importing .htaccess rules

I briefly spoke about manually modifying web.config to add rewrite rules in our post on Redirecting to HTTPS when using IIS behind a load balancer. This time I'm going to describe how to import the rewrite rules of a .htaccess file directly into IIS.

  • Firstly, open IIS manager and then navigate to the api/rest folder of your MantisBT installation

  • Next open the URL Rewrite section.

  • Click the Import Rules... option in the Actions sidebar.

  • In the Configuration file field, select the .htaccess file located in the local api/rest folder and then click Import.

  • Verify that the Rewrite rules field displays the appropriate redirect and that Converted Rules indicates that the rule was successfully imported.

    Importing .htaccess rules into IIS
    Importing .htaccess rules into IIS
  • In the Actions sidebar, click Apply to save the changes, then click Back to Rules to return to to the main URL Rewrite section listing the imported rule.

    The imported configuration
    The imported configuration

That should be all that is required; the REST API calls should now rewrite and succeed. To quickly test that all is well, open up http://yourinstantURL/api/rest/projects/ in your browser - if you get a 401 error, then the redirect is working correctly.

Manually updating the configuration

If your instance is hosted remotely you might not have direct access to IIS Manager or be able to remotely connect to it. Below is the complete web.config file used to enable redirects, simply copy it to the /api/rest folder of your MantisBT instance.

xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="API Redirect" stopProcessing="true">
          <match url="^" ignoreCase="false" />
          <conditions logicalGrouping="MatchAll">
            <!--# Based on Slim Framework recommendation @ http://docs.slimframework.com/routing/rewrite/-->
            <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
          </conditions>
          <action type="Rewrite" url="index.php" appendQueryString="true" logRewrittenUrl="true" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Update History

  • 2018-03-30 - First published
  • 2020-11-22 - Updated formatting

Like what you're reading? Perhaps you like to buy us a coffee?

Donate via Buy Me a Coffee

Donate via PayPal


Comments