2013-12-10 9 views
0

я следующий код в моей странице index.php:Исправить петлю перенаправления?

<?php include("/includes/widgets.php") ?> 

И в моей странице widgets.php:

<?php 
    header("Location: /"); 
?> 

То, что я хочу добиться с этим, чтобы перенаправить его, если пользователь посещает его, но разрешает его включать.

Но я получаю следующее сообщение об ошибке:

The webpage has a redirect loop

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

+12

[Единственный способ исправить это - не иметь переадресации.] (Http: // stackoverflow.com/questions/20500919/fix-a-redirect-loop # comment30643944_20500919) – qwertynl

+1

Если вы указали widgets.php на своей индексной странице, эта страница будет постоянно перезагружаться. Вам необходимо либо удалить include, либо вызов 'header()'. – andrewsi

+0

add 'header (' HTTP/1.1 301 Перемещено на постоянной основе ');' Я говорю об этом, если вы заставляете людей, которые раньше использовали страницу виджетов. – ryan0319

ответ

1

Поместите widgets.php файл в папке, недоступной для HTTP-клиентов. I. на веб-сервере apache, поставьте его выше вашего корня документа (в его родительский элемент) или используйте файл .htaccess, чтобы заблокировать пользователей.

например.

deny from all 
+0

Я возвращаю свой комментарий. Хорошо сделано, чтобы выяснить, что он пытался сделать! – andrewsi

-1

Одним из возможных способов является добавление параметра в перенаправление, например.

if (!$_REQUEST['redirect']) 
    header("Location: /ìndex.php?redirect=1"); 

Таким образом перенаправление может произойти только один раз.

Другим способом является остановка перенаправления, если пользователь уже находится на /. Я бы предложил объединить оба.

0

Проблема в том, что вы перенаправляетесь обратно на ту же страницу, которая затем перенаправляется снова, и снова, и снова.

Простым решением было бы перевернуть перенаправление в if и переадресовать, если они еще не находятся на индексной странице; но это просто исправление того, что выглядит как архитектурная проблема.

Что-то вроде:

if (ltrim($_SERVER['REQUEST_URI'], '/') != 'index.php') 
    header('Location: index.php'); 
0

Один из способов проверить, если __FILE__, что файл загружен, независимо от того, включен или не совпадает с требуемым файлом, который находится в $_SERVER['REQUEST_URI'] (или $_SERVER['PHP_SELF']).

Я использую это на нашем сайте разработки на странице, которая обычно включается для получения вывода в качестве отладки.

if(basename($_SERVER['PHP_SELF'])===basename(__FILE__)){ 
    //do some debugging 
} 

Обычно вы не будете использовать базовое имя, но это на развитие сайта непубличный облицовочного и файл имеет довольно уникальное имя, так что я не беспокоюсь файл включаются с другим файлом с то же имя или что угодно.

1

Я думаю, я знаю, что вам нужно :) индексный код

Изменить файл на следующий

define("IS_INDEX", true); 
include("/includes/widgets.php" 

Изменить код для widgets.php к следующему

if (!defined("IS_INDEX")) { 
    header("Location: /"); 
    exit(); 
} 
+0

Я знаю, что это то, что делают многие популярные программы PHP. Наверное, просто из-за того, насколько это просто. –

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