redireccionar htaccess enmascarar dominio con carpeta http .htaccess mod-rewrite https http-status-code-401

enmascarar - aparece un error extraño 401 para algunas URL al usar.htaccess para redirigir http a https



redireccionar http a https htaccess (2)

OK, aquí está el séptimo día de intento infructuoso de encontrar una respuesta por qué aparece el error 401 ...

Ahora, .htaccess en la carpeta raíz contiene las 3 únicas cadenas (se simplificó) y NO hay más archivos .htaccess en el proyecto:

RewriteEngine On RewriteCond %{HTTPS} !on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Por lo tanto, redirige todas las solicitudes para que sean https. Funciona bien para cualquier URL, incluso para / directorio de administración.

Asi que,

http://mydomain.com

se convierte

https://mydomain.com

Si se ingresó https://mydomain.com , no hay redirecciones.

http://mydomain.com/administration/index.php

se convierte

https://mydomain.com/administration/index.php

Si se ingresó https://mydomain.com/administration/index.php , no hay redirecciones.

Eso está claro, y el problema está abajo.

Quiero que el directorio / administration esté protegido con contraseña. Mi panel de control de alojamiento compartido permite proteger directorios sin la creación manual de .htaccess y .htpasswd (elige un directorio para proteger, crea un nombre de usuario y una contraseña, y .htaccess y .htpasswd se crean automáticamente). Entonces, .htaccess aparece en la carpeta / administration. .htpasswd aparece en otro lugar, la ruta a .htpasswd es correcta y todo parece correcto (funciona de la misma manera que para crearlo manualmente). Entonces, hay 2 archivos .htaccess en el proyecto, uno en el directorio raíz y otro en el directorio / administration (con .htpasswd en el directorio .htaccess sabe dónde está).

Una vez que se crea la contraseña, los resultados son:

Tu entras:

https://mydomain.com/administration/index.php

Luego solicita ingresar una contraseña. Si lo ingresa correctamente, se muestra https://mydomain.com/administration/index.php . El resultado: funciona perfecto.

Pero, si ingresa a http://mydomain.com/administration/index.php (sí, http, sin S), en lugar de redireccionar a la misma página, pero https, redirecciona a

https://mydomain.com/401.shtml (starts with httpS)

por un motivo desconocido e incluso NO pide una contraseña. ¿Por qué?

Me he puesto en contacto con un servicio de atención al cliente con respecto a esta pregunta y están seguros de que el problema está en el archivo .htaccess, y no corrigen los archivos .htaccess (eso está claro, no, no me importa).

¿Por qué pasó esto? ¿Olvidé poner algunas banderas, o algunas opciones para cambiar la configuración predeterminada en el archivo .htaccess?

PSCreando .htaccess y .htpasswd manualmente (no desde el Panel de control de alojamiento) para la carpeta / administración provoca el mismo error 401 en caso de que no sea https, pero se ingresó http.

Y el problema aparece solo con URLs / directorio de administración.

Gracias.


Intenta usar esto en su lugar. No la bandera L y R.

RewriteEngine On RewriteCond %{HTTPS} !on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

También borre primero la memoria caché de su navegador para eliminar la antigua redirección incorrecta.

Si eso no funciona, intente usar esto.

RewriteCond %{HTTPS} !on RewriteCond %{THE_REQUEST} ^(GET|HEAD)/ ([^/ ]+) RewriteRule ^ https://%{HTTP_HOST}%2 [L,R=301]

Me siento un poco mal por escribirlo, ya que parece un poco hackish en mi opinión.

EDITAR Parece que la segunda opción solucionó el problema. Así que aquí está la explicación de por qué funciona.

El módulo de autenticación se ejecuta antes del módulo de reescritura. Debido a que el nombre de usuario y la contraseña no se envían al solicitar por primera vez la página, el módulo de autenticación internamente ''reescribe'' la url de solicitud en la url de la página 401. Después de este mod_rewrite,% {THE_REQUEST} ahora contiene 401.shtml lugar de la url original. Por lo tanto, la redirección resultante contiene 401.shtml, y no la url que desea.

Llegue al URL original (no ''reescrito''), necesita extraerlo de% {THE_REQUEST}. THE_REQUEST tiene el formato [requestmethod] [url] HTTP[versionnumber] . RewriteCond extrae solo la parte central ( [url] ).

Para completar, agregué los indicadores [L,R=301] a la segunda solución.


¡Creo que encontré una solución aún mejor para esto!

Solo agrega esto a tu .htaccess

ErrorDocument 401 "Unauthorized"

Solución encontrada en:

http://forum.kohanaframework.org/discussion/8934/solved-for-reall-this-time-p-htaccess-folder-password-protection/

- EDITAR

Finalmente descubrí que la causa raíz del problema era que ModSecurity marcaba mis datos de POST (los códigos de secuencia de comandos y las etiquetas iframe causan problemas). Intentó devolver un 401/403 pero no pudo encontrar el documento de error predeterminado porque ModSecurity había hecho que mi htaccess se volviera loco.

El uso de ErrorDocument 401 "No autorizado" omitió el problema del documento de error faltante pero no hizo nada para abordar la causa raíz.

Para esto, terminé usando javascript para agregar ''salt'' a cualquier cosa que no fuera un espacio en blanco ni un carácter de palabra ...

$("form").submit(function(event) { $("textarea,[type=text]").each(function() { $(this).val($(this).val().replace(/([^/s/w])/g, "foobar$1salt")); }); });

luego PHP para quitar la sal de nuevo ...

function stripSalt($value) { if (is_array($value)) $value = array_map(''stripSalt'', $value); else $value = preg_replace("/(?:foobar)+(.)(?:salt)+/", "$1", $value); return $value; } $_POST = stripSalt($_POST);

Muy, muy, muy importante Nota:
No use "foobar $ 1salt"; de lo contrario, esta publicación acaba de mostrar a los hackers cómo omitir su ModSecurity.

Notas de Regex:
Pensé que podría valer la pena mencionar lo que está pasando aquí ...

(?: foobar) + = unir la primera mitad de sal una o más veces, pero no almacenar esto como un grupo coincidente;

(.) = une cualquier carácter y lo almacena como el primer y único grupo (accesible a través de $ 1);

(?: salt) + = unir la segunda mitad de sal una o más veces, pero no almacenar esto como un grupo coincidente.

Es importante hacer coincidir la sal varias veces por personaje, porque si pulsas Enviar y luego usas el botón Atrás, volverás al formulario con toda la sal todavía ahí. Pulse enviar de nuevo y se agrega más sal. Esto puede suceder una y otra vez hasta que termines con algo como: foobarfoobarfoobarfoobar> saltsaltsaltsalt