La situación que describes es justamente la que debería de producirse ante una redirección 301. Es decir, el navegador está trabajando según lo esperado.
Ten en cuenta que el código 301 indica una redirección permanente. Por ello, el navegador hace bien en cachearla, dado que esa URL siempre iría a redirigir al mismo URL de destino. Puedes comprobarlo si simplemente borras la caché del navegador. En ese caso se volverá a procesar la URL, haciendo el tratamiento que hayas programado, dado que el navegador se habría olvidado de la redirección 301.
La solución es muy sencilla, usar una redirección 302 que indica que es temporal. Una redirección 302 no se cachea en el navegador, porque no indica que sea permanente y por tanto cada vez te puede llevar a un destino diferente. De ese modo, tu proceso se ejecutará siempre y tendrás el comportamiento deseado para tu aplicación.
Debes tener en cuenta que las redirecciones 301 sólo se deben usar cuando realmente sean permanentes y nunca cuando esas redirecciones puedan cambiar de destino, o se deban procesar datos antes de realizar la redirección como en tu caso. Si no deseas cachear la redirección en el navegador, usa 302.
header("HTTP/1.1 302 Moved Temporarily");
header("Location: /index.php");