Apache returns 404 when trying to load file with AJAX or Flash
If an Apache instance is really locked down, mod_security will deny requests if the request’s content-type is “weird”. The first time you come across this you’ll be baffled because Apache returns a 404 Not Found instead of something like a 401 or 403 Forbidden. Then you’ll open the offending file in a browser and it will load just fine. I came across this problem with Drupal and WordPress. In Drupal, I was making AMF calls and Apache didn’t like that my request content-type was application/x-amf. In WordPress, it was wp-admin/admin-ajax.php that pissed it off.
If you can AllowOverride in Apache, just put this in an .htaccess file to loosen up the security. (Actually, this completely unties it)
<IfModule mod_security.c> SecFilterInheritance Off </IfModule>
If not, you need to edit your Apache conf to allow the needed content-type. Something like this:
SecFilterSelective HTTP_Content-Type "!(^$|^application/x-www-form-urlencoded$|^application/x-amf)"
I have a php script to prove your server has this issue. This is useful when trying to convince stubborn sys admin the 404 is his problem. View it after the jump…
<?php $url= 'http://'.$_SERVER['SERVER_NAME']; $ch = curl_init( $url ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/x-www-form-urlencoded' )); $response1 = curl_exec($ch); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/xml' )); $response2 = curl_exec($ch); ?> <html> <head> <style> * { font-family: arial; font-size: 11px;} textarea { width:100%; height: 600px; } table { width:100%; } td { width:45%; } </style> </head> <body> <table><tr><td> POST to <b><?php echo $url; ?></b> with Content-Type: application/x-www-form-urlencoded<br/> <textarea><?php echo $response1;?></textarea> </td><td> POST to <b><?php echo $url; ?></b> with Content-Type: application/xml<br/> <textarea><?php echo $response2;?></textarea> </tr></table> </body> </html>
1 Comment
Jump to comment form | comments rss [?] | trackback uri [?]