2010-09-12 1 views
0

A У меня есть файл PHP, который, если пользователь обращается к нему напрямую, должен быть перенаправлен в другое место, но если мой скрипт вызывает его через ajax, он не должен делать ничего особенного.Как определить, осуществляется ли доступ к файлу или его запрос?

Например, если пользователю доступ

/site/page.php 

он должен быть перенаправлен на

/index.php?view=page 

Но если он находится на index.php?view=page файл должен загрузить без редиректа.

Как я могу это сделать?

+0

Вы используете фреймворк для своих вызовов Ajax? Если да, то какой? jQuery и некоторые другие отправляют специальный заголовок. –

+0

Подождите, каков ваш вопрос. Является ли это обнаружением вызова Ajax или обнаружением URL-адреса? Я не понимаю. –

+0

Пользователь не может получить доступ к '/ site/page.php', но он может получить доступ к' /index.php? V = page', который делает вызов этого URL-адреса и получает его содержимое – BrunoLM

ответ

5

EDIT: Если вы хотите определить, был ли сценарий запрошен с помощью Javascript или нет, вам придется как-то сигнализировать об этом.

Несколько наборов инструментов определяют заголовок X-Requested-With. В этом случае, вы можете проверить для вызова Javascript с:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
     strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    //requested with Javascript 
} 

Вы можете проверить размер результата дается debug_backtrace.

В качестве альтернативы (лучше), вы можете проверить $_SERVER['SCRIPT_FILENAME']:

if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME'])) { 
    //this one was requested; not in include 
} 

+0

Я не думаю, что это то, что OP означает. (Хотя я не уверен, что * OP означает.) –

+0

Оба доступа к странице и вызов были возвращены true на ваш второй ответ. – BrunoLM

+0

@Pekka Ну, я просто прочитал название: p – Artefacto

0

По "он не должен делать ничего особенного" вы имеете в виду, что не следует перенаправить?

Таким образом, Q действительно, если пользователь обращается к URL-адресу для файла PHP напрямую, он должен перенаправлять, если через AJAX обрабатывается как обычно? (чтобы действительно разъяснить, вы имеете в виду через URL-адрес, а не через заявку на включение, верно?)

Ответ: Вы не можете. Artefacto упоминает заголовок HTTP_X_REQUESTED_WITH - конечно, но это может быть фальсифицировано.

Действительно ли так плохо, что пользователь обращается к URL-адресу напрямую? Если ответ «OMG Yes!» то, возможно, что-то не так, как система разработана. Редизайн до тех пор, пока не ответит: «На самом деле, я полагаю, это не повредит».

+0

В этом случае не имеет значения, можно ли его подделать. И важно, чтобы страница перенаправлялась, потому что поисковые системы не работали должным образом для этого приложения. – BrunoLM

+0

Поисковые системы? Я не понимаю. Вы не хотите, чтобы эта страница отображалась в поисковых системах? Если эта страница связана только с вызовами Javascript AJAX, то бот поисковой системы никогда не найдет ее и никогда не посетит. ЕСЛИ вы действительно параноидально, что ссылка просочится, поместите на нее HTTP-заголовок X-Robots-Tag. http://googleblog.blogspot.com/2007/07/robots-exclusion-protocol-now-with-even.html – James

0

Если вы действительно не хотите, чтобы кто-то обращался к /site/page.php, вам следует рассмотреть возможность перемещения /site/page.php за пределами вашего веб-корня. Затем сделайте свой index.php загрузите его по мере необходимости:

<?php 
$includes = "/path/to/includes"; // specified in a config file somewhere 

if ($_GET["view"] == "page") { 
    require_once(path_join($includes, "page.php")); 
    DoStuffInPageDotPHP(); 
} 
else { 
    DoSomethingElse(); 
} 
?> 
Смежные вопросы