Как и в названии, интересно, если мне нужно поставить exit();
после каждого оператора PHP if, или только основного оператора if или только последнего оператора if? В настоящее время у меня есть на последнем, если заявление, и он работает нормально.
if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {
if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) || $occupation == '' ) {
header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);
}
if ( $arr_position == '' ) {
header ('Location: http://' . $domain . '/jobs/', true, 301);
}
if ( isset($home) && $arr_position == '' ) {
header ('Location: http://' . $domain, true, 301);
}
if ( isset($home) && $arr_position != '' ) {
header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);
exit();
}
}
ОБНОВИТЬ
Я изменил его, чтобы иметь выход () после каждого вызова местоположения заголовка, и все по-прежнему работает нормально. Это в моем основном файле шаблона, так что да, есть код ниже, который нуждается в выполнении, если ничто не совпадает в расположении заголовка блока.
У меня сейчас так
if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {
if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) || $occupation != strtolower($arr_occupation) ) {
header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);
exit();
}
if ( $arr_position == '' ) {
header ('Location: http://' . $domain . '/jobs/', true, 301);
exit();
}
if ( isset($home) && $arr_position == '' ) {
header ('Location: http://' . $domain, true, 301);
exit();
}
if ( isset($home) && $position == urlencode($arr_position) ) {
header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);
exit();
}
}
ОБНОВЛЕНИЕ 2
Я пошел дальше и использовал ответ DefiniteIntegral, потому что мне нравится логика, но мне пришлось использовать отдельные операторы if в основном блоке. С помощью elseif
не работает. Я полностью проверил это и использую различные условия в каждом elseif
и это просто не будет работать правильно. Так что я в порядке с использованием отдельных операторов if в основном блоке.
Вот как это выглядит сейчас
if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {
$new_url = false;
if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) || $occupation != strtolower($arr_occupation) ) {
$new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
}
if ( $arr_position == '' ) {
$new_url = 'http://' . $domain . '/jobs/';
}
if ( isset($home) && $arr_position == '' ) {
$new_url = 'http://' . $domain;
}
if ( isset($home) && $arr_position != '' ) {
$new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
}
if ($new_url !== false) {
header('Location: ' . $new_url, true, 301);
exit();
}
}
ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ
Наконец-то все заработало elseif
заявления. Пришлось добавить больше условий к if
заявления в каждом elseif
блок кода.
Конечный код выглядит так
if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {
$new_url = false;
if ( !isset($occupation) || $occupation != strtolower($arr_occupation) || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) ) {
$new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
} elseif ( isset($home) ) {
if ( !isset($position) || $position != $arr_position || $position == '' ) {
$new_url = 'http://' . $domain;
} else {
$new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
}
} elseif ( $currentPage == 'Jobs' ) {
if ( !isset($position) || $position == '' ) {
$new_url = 'http://' . $domain . '/jobs/';
} elseif (isset($position) && $position != '' && $position != $arr_position) {
$new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
}
}
if ($new_url !== false) {
header('Location: ' . $new_url, true, 301);
exit();
}
}
Если ваша цель — всегда выполнять перенаправление в этом блоке, поместите оператор выхода после последнего блока if, за скобками. Если под блоком, который вы нам показали, есть код, он все равно будет выполняться без необходимости, если целью является перенаправление.
if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {
$new_url = false;
if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) || $occupation == '' ) {
$new_url = 'http://' . $domain . strtolower ( '/ jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
} elseif ( isset($home) ) {
if ( $arr_position == '' ) {
$new_url = 'http://' . $domain;
} else {
$new_url = 'http://' . $domain . strtolower ( '/ jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
}
} elseif ( $arr_position == '' ) {
$new_url = 'http://' . $domain . '/jobs/';
}
if ($new_url !== false) {
header('Location: ' . $new_url, true, 301);
exit;
}
}
В вашем случае после каждого header()
Звоните: у вас есть 4 различных условия и ни один или более могут не совпадать так что вы могли бы выполнять несколько header()
звонки или вообще ничего, когда вы прошли свой последний if
заявление, в результате чего ваша страница для выхода без какого-либо перенаправления на всех.
Если бы это был блок из одного if
заявление с 1 или более elseif
заявления, которые закончились else
, все содержащие перенаправления, вы можете поставить его в конце:
if
header();
elseif
header();
elseif
header();
else
header();
exit;
Но это будет единственный сценарий, так как вам понадобится какая-то обработка ошибок, если ни один из if
операторы в вашем текущем коде не совпадают.