по-быстрому накидал на локалке рабочий пример index.php (дописал кусочек чтоб менялся хэш в строке браузера когда работает подгрузка контента через ajax и работали кнопки назад/вперед в браузере) <?require_once('content.php');?><!DOCTYPE html><html><head> <title></title> <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.min.js"></script> <script type="text/javascript" src="/jquery.history.js"></script> <script type="text/javascript"> $(document).ready(function(){ if(History.enabled){ $(document).on( "click", "a", function(e) { e.preventDefault(); History.pushState(null, null, $(this).attr('href')); return false; }); History.Adapter.bind(window, "statechange", function () { var state = History.getState(); var url = state.hash.replace('/', ''); var box = $('a[href="'+url+'"]').data('box'); $('#'+box).empty().load('/ajax.php?url='+url); }); if(History.getHash()){ History.replaceState(null, null, History.getHash()); }; } }); </script></head><body> <a href="page1.html" data-box="result-page">link to page1.html</a> <a href="page2.html" data-box="result-page">link to page2.html</a> <a href="page3.html" data-box="result-page">link to page3.html</a> <div id="result-page"><?=$content;?></div></body></html>ajax.php <?require_once('content.php');echo $content;?>content.php <?if(isset($_GET['url'])){ switch(trim($_GET['url'])) { case 'page1.html': $content = "page1.html content"; break; case 'page2.html': $content = "page2.html content"; break; case 'page3.html': $content = "page3.html content"; break; default: $content = 'index.php content'; break; }}else{$content = 'index.php content';}?>.htaccess RewriteEngine OnRewriteBase /RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_URI} !=^/ajax.php.*RewriteRule ^(.*)$ /index.php?url=$1 [L,QSA]В итоге сайт работает и при включенном js(контент грузится через ajax) и по прямым ссылкам. UPD Немного дописал js под history.js UPD2 ещё немного изменил.