Я уже ответил на этот вопрос, но я сделаю это снова, так как между тем я узнал, что есть особые случаи, если вы работаете в CLI (перенаправления не могут произойти и, следовательно, не должны exit()
), или если ваш веб-сервер работает с PHP как (F) CGI (для правильной переадресации требуется предварительно установленный заголовок Status
).
function Redirect($url, $code = 302)
{
if (strncmp('cli', PHP_SAPI, 3) !== 0)
{
if (headers_sent() !== true)
{
if (strlen(session_id()) > 0) // if using sessions
{
session_regenerate_id(true); // avoids session fixation attacks
session_write_close(); // avoids having sessions lock other requests
}
if (strncmp('cgi', PHP_SAPI, 3) === 0)
{
header(sprintf('Status: %03u', $code), true, $code);
}
header('Location: ' . $url, true, (preg_match('~^30[1237]$~', $code) > 0) ? $code : 302);
}
exit();
}
}
Я также рассмотрел вопрос о поддержке различных Коды перенаправления HTTP (301
, 302
, 303
и 307
), как это было описано в комментариях к моему предыдущему ответу, вот описания:
Вы можете использовать SetEnvIf
против URI
только формы root, как это:
SetEnvIf Request_URI "^/?(login|reset|raport)\.php" PASS
AuthUserFile /home/myaccount/public_html/.htpasswd
AuthType Basic
AuthName "Restricted area"
Order Deny,Allow
Deny from all
Satisfy any
Require valid-user
Allow from env=!PASS
Итак, форма здесь SetEnvIf Request_URI "^/?(login|reset|raport)\.php
вы убедитесь, что URI
начинается с login|reset|raport
только подкаталог.