IF no se encarga de redirigir, simplemente es una estructura de control.
Despues de un redireccionamiento con header, es conveniente agregar
exit; para forzar a que se detenga el script.
Como lo tienes:
if( condicion1 && condicion2 || condicion 3 )
Si se cumple 1 y 2... o solo 3, siempre va a entrar?, creo que si
Tendrias que agrupar las comparaciones para evitar usar otro if:
if ( condicion1 && ( condicion2 || condicion3 ) )
Solo si se cumple 1 y cualquiera de 2 y 3