Intro
I have been recently migrating some of my company data from one Apache server into another with different configuration. After moving the web content I noticed that some of the links on the website are broken. After detailed troubleshooting I finally compared them with the original ones and it occurred that what's causing the issue was the %252F code in URL instead of %2F. After some hours spent on searching solution in the Internet I have finally managed to fix the above issue by setting up the NE flag in Apache RewriteRule directive. However the above is fully sufficient to make it working and you can stop here, please find the detailed description of the issue both with the solution in the following sections.
Case
1) You are using the Apache server with rewrite module enabled and Rewrite directives inside its configuration files.
2) Some of the URLs get broken that the %252F code is being displayed in a browser instead of expected %2F code.
Cause
The %2F is an encoded forward slash (/) while the %252F is double encoded forward slash. This happens because of using the rewrite module that the Apache first encodes the forward slash characters and then encodes them one more time by default. As a result the browser refers to the directory on the Apache server that does not exist as the directories paths are separated by '/' characters in file system instead of '%2F' characters, aren't they?
Solution
There is a quick solution for the above issues. All you need to do is to add the NE flag into the Apache RewriteRule directive. The NE flag preserves special characters (i.e. '/' character) from being encoded resulting in '/' being encoded only once. The following is an example of such a directive that I used on my Apache web server:
RewriteRule ^/$ https://www.domain.com/files/ [NE,R,L]
The above redirects browsers connecting into the www.domain.com website into the 'files' directory.
Summary
The above issues is not a bug, but it is rather a bad design. You need to change the default behavior of the rewrite engine to make it working. I hope that you will find this article useful.
awesome.. Thanks for the blog. it helped fixed similar issue.
ReplyDeleteThank you a lot. You saved my day...
ReplyDeleteGreat. Thanks for this. Saved me A LOT trouble!!!
ReplyDeleteThank you, man! That explanation helped me a lot!
ReplyDeleteHello,
ReplyDeleteAnd what do you think about add the following directive in the virtual Host configuration
AllowEncodedSlashes on
The Apache documentation said :
"The AllowEncodedSlashes directive allows URLs which contain encoded path separators (%2F for / and additionally %5C for \ on accordant systems) to be used in the path info."
Knowledge is only valid if it's shared
This actually helped, the NE flag not so much.
DeleteThanks for the blog ..this solved my issue ,too :)
ReplyDeleteThank you for this writeup. It saved a me a ton of time debugging this issue.
ReplyDeleteHi Guys, how would we add the NE flag in IIS? Any help would be appreciated.
ReplyDeleteOMG this blog post just helped me tremendously. Thank you!!!
ReplyDelete