Фильтровать Ajax запросы на уровне.htaccess Как??

Работая над своим велосипедом столкнулся с проблемой фундаментуального характера, около месяца думаю как обойти одну не приятную вещь.
В системе все запросы идут на контроллер и там происходит разбор переменных url в нормальный вид. Ajax запросы соответственно тоже туда попадают и принимаются как обычные, а нужно по многим причинам конечно их фильтровать, только проблема в том, что после редиректа .htaccess'om, ни какими средставами php не получается отделить его, все проверки, которыми кишит веб просто не дают результата, т.к. после перенаправления это и есть обычный запрос... Есть ли возможность на htaccess распарсить, еще до попадания в контроллер, и сноса своих переменных? Я уже наверно 20-30 страниц гугла просмотрел - все не то!

1 ответов


Ерунда какая-то. Вне зависимости от того, как mod_rewrite изменил запрос, заголовки остаются целыми.
Вот и проверяй:


    public function isXmlHttpRequest()
    {
        return ($this->getHeader('X_REQUESTED_WITH') == 'XMLHttpRequest');
    }

    public function getHeader($header)
    {
        if (empty($header)) {
            require_once 'Zend/Controller/Request/Exception.php';
            throw new Zend_Controller_Request_Exception('An HTTP header name is required');
        }

        // Try to get it from the $_SERVER array first
        $temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header));
        if (isset($_SERVER[$temp])) {
            return $_SERVER[$temp];
        }

        // This seems to be the only way to get the Authorization header on
        // Apache
        if (function_exists('apache_request_headers')) {
            $headers = apache_request_headers();
            if (isset($headers[$header])) {
                return $headers[$header];
            }
            $header = strtolower($header);
            foreach ($headers as $key => $value) {
                if (strtolower($key) == $header) {
                    return $value;
                }
            }
        }

        return false;
    }
 
Если же ты не обычный rewrite используешь, а именно редирект, то, как говорится, сам виноват. Разве что, попробуй в правило с редиректом добавить:

RequestHeader set MY_AJAX "ajax"
 

Попробуйте
RewriteRule бла-бла-бла [E=SOME:true]
где надо "пометить" запрос.
И в скрипте будет видно $_SERVER['SOME']


Как правило, можно распознать по $_SERVER['HTTP_X_REQUESTED_WITH']

Но проще, лучше и понятней при написании клиентских скриптов изначально в запрос добавлять дополнительный параметр ajax = true. Можно вообще отправлять на отдельный контроллер все ajax-запросы.


Вот мне так и нужно! На отдельный контроллер их слать, подскажите что нужно в htaccess прописать.

RewriteEngine On
DirectoryIndex control.php
Options +FollowSymlinks
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+) exmpl/control.php?do=$1 [L]

Тут разбор url в ЧПУ, я не очень силен в этом, к сожалению, подскажите пожалуйста как например аякс переправлять на exmpl/control-ajax.php?do=$1 [L] это будет лучший вариант, если так возможно, не хочу через php доп. скрипт дописывать. Вы написали про параметр ajax=true, вы имеете ввиду это прикреплять в момент отправки? т.е. в js? но это ведь не безопасно вроде как.


А почему бы Ajax запросы не посылать на сервер POST-ом. Точно не перепутаеш.