2015-07-11 1 views
1

Я новичок в PHP и надеюсь, что кто-то может мне помочь.PHP: Как проверить, содержит ли ссылка URL, чтобы предотвратить перенаправление (остальная часть кода работает)

Я пытаюсь охватить следующие сценарии в заголовочном файле, который включен на всех моих страницах:

  1. IF переменная сеанса «status» не установлен и название страницы не «login» или " user "Затем перенаправляйте страницу входа.
  2. Предел переменной сеанса «status» не установлен И имя страницы «user» И переменная «resetToken» не установлена. ТОГДА перенаправляется на страницу входа.

До сих пор у меня есть ниже, который работает для всех страниц при доступе к ним из браузера, но , когда я использую ссылку из электронной почты, как следующий я еще попадаю даже если ссылка содержит переменную "resetToken «:

Пример ссылка: https://www.myurl.com/user.php?resetToken=abcde

Мой PHP (в заголовке включить):

$baseURL = "https://www.myurl.com"; 
$pageURL = basename($_SERVER["REQUEST_URI"]); 
$pageName = pathinfo(parse_url($pageURL, PHP_URL_PATH), PATHINFO_FILENAME); 

if((!isset($_SESSION["status"])) && ($pageName != "login") && ($pageName != "user")){ 
    header("Location: " . $baseURL . "/login.php"); 
    exit; 
} 
if((!isset($_SESSION["status"])) && ($pageName == "user") && (!isset($_GET["resetToken"]))){ 
    header("Location: " . $baseURL . "/login.php"); 
    exit; 
} 

У меня есть два вопроса относительно этого:

  1. ли $ _GET не работают, когда доступ к странице через ссылку по электронной почте или я должен изменить что-то еще здесь?
  2. Есть ли способ объединить эти проверки в одном выражении IF вместо из двух строк?

Большое спасибо за любую помощь, Майк

+1

Конечно, вы можете комбинировать 'if'. При этом следует учитывать недостаток читаемости. Параметры URL-адресов в электронных письмах иногда сдерживаются неявными разрывами строк (автоматическое разбиение на 72 символа или менее на некоторых клиентах для обычных текстовых сообщений). – mario

ответ

1
  1. $_GET делает работу независимо от того, где URL была нажата
  2. комбинируя два утверждения легко, просто обернуть их () и объединить их с ||

PHP

if( 
    (
     (!isset($_SESSION["status"])) && ($pageName != "login") && 
     ($pageName != "user") 
    ) || (
     (!isset($_SESSION["status"])) && ($pageName == "user") && 
     (!isset($_GET["resetToken"])) 
    ) 
){ 
    header("Location: " . $baseURL . "/login.php"); 
    exit; 
} 

Когда вы перенаправляете, даже если вы установили токен, вы должны сбросить переменная до. Код, поскольку он не должен перенаправляться, когда установлен токен.

+0

Большое спасибо за это! Я попробовал это, но я все еще перенаправляюсь на страницу входа, когда URL-адрес содержит /user.php?resetToken=xyz. При сбросе переменной я получаю NULL. Любые мысли по этому поводу? - Это даже случается, если я вставляю URL-адрес вручную в браузере, поэтому по какой-то причине кажется, что он здесь не распознает переменную. – keewee279

+0

Обновление: Я думаю, что знаю, что вызывает это (не знаю, как это исправить): когда я просто использую буквы и цифры для переменной, тогда он работает, но в моем случае переменная содержит некоторую хэшированную и зашифрованную информацию, чтобы сбросить пароль, и похоже, что он не распознает переменную. - Единственными специальными знаками, которые это содержат, являются $ sign и forward slashes, которые создаются PHP. – keewee279

+0

Это не связано с вашим вопросом. Я не знаю, как выглядит эта переменная. –

1
$baseURL = "https://www.myurl.com"; 
$pageURL = basename($_SERVER["REQUEST_URI"]); 
$pageName = pathinfo(parse_url($pageURL, PHP_URL_PATH), PATHINFO_FILENAME); 

if((!isset($_SESSION["status"])) && 
    ($pageName != "login") && 
    ($pageName != "user") 
    || 
    (!isset($_SESSION["status"])) && 
    ($pageName == "user") && 
    (!isset($_GET["resetToken"])) 
    ) 
    { 
     header("Location: " . $baseURL . "/login.php"); 
     exit; 
    } 

У вас есть 2 if условия и перенаправлении на одной странице ... Вы можете объединить их в 1 if состоянии.

+0

Спасибо за это! – keewee279

 Смежные вопросы

  • Нет связанных вопросов^_^