Ensure EPiServer Geo-IP personalisation works when using Akamai
Jul 07, 2011
As we know by now EPiServer comes with a Geo-IP database built in which gives editors the ability to target content based on a location that is looked up from their IP address. However the geo-IP look up wont work properly if you are using a web acceleration service such as Akamai. This is because the originating IP will be that of the edge server, rather than the user's real IP.
I needed to ensure that EPiServer personalisation would work when using Akamai's web acceleration. The built in location based criterion used in Visitor Groups ultimately uses the "REMOTE_ADDR" server variable to get the user's originating IP address so this needed to be changed. Usefully Akamai normally passes the actual originating IP of the user in a custom variable called "True-Client-IP". So the requirement is simple, replace the REMOTE_ADDR server variable with the value from "True-Client-IP" and geo-IP look ups should all work fine.
In a previous post I described Using the IIS rewrite module to test EPiServer geo-IP look up personalisation. So this post is simply an evolution of that rule. This is what I wanted to do:
- Grab the incoming request
- Look for the Akamai "True-Client-IP" header that contains something that looks like an IP address (if its not there then don't continue)
- Replace the REMOTE_ADDR server variable with the value of True-Client-IP
- Blank out the True-Client-IP value
In order to use the solution you must do two things:
- Add the server variables that you want to modify. See the instructions on my previous post on how to do this. Add REMOTE_ADDR and True-Client-IP as the server variables to modify.
- Use the following rule in web.config that implements the functionality I explained above:
<system.webServer>
...
<rewrite>
<rules>
<rule name="Map true incoming IP address"
patternSyntax="Wildcard" stopProcessing="false">
<match url="*" />
<action type="None" />
<serverVariables>
<set name="REMOTE_ADDR" value="{C:0}" />
<set name="TRUE-CLIENT-IP" value="" />
</serverVariables>
<conditions>
<add input="{HTTP_TRUE_CLIENT_IP}" pattern="*.*" />
</conditions>
</rule>
</rules>
</rewrite>
...
</system.webServer>
This solution should work if you are using Akamai as your web acceleration provider. I can't vouch for any other providers!
Testing
Obviously to test this I can't have Akamai pointing to my development box. So I used the Firefox add on Modify Headers to spoof the Akamai header.
Feedback
I'd be happy to hear any feedback on the comments below or @davidknipe