Pregunta

Cada conjunto de reglas a continuación funciona bien cuando se usa solo. Sin embargo, cuando se usan juntos, el comportamiento de las reglas cambia.

Cuando el conjunto de reglas # 2 se usa solo, una solicitud de https: // internal / Security / login es reescrito por Apache para zafiro / main.php sin el conocimiento del navegador. Este es el comportamiento esperado.

Cuando ambos conjuntos de reglas se usan juntos, una solicitud de la URL mencionada anteriormente hace que Apache envíe una redirección 301 a http: //internal/sapphire/main.php? url = Seguridad / inicio de sesión .

¿Por qué Apache envía esta redirección en lugar de hacer una reescritura interna?

# Rule Set # 1
# - Forces all HTTPS requests to HTTP, except for security section requests.
#   Example: request for https://internal/abc/ 
#   -> redirected to http://internal/abc/
RewriteCond %{SERVER_PORT} =443
RewriteCond %{REQUEST_URI} !^/Security($|/.*$)
RewriteRule (.*) http://internal/$1 [R=301,L]

# Rule Set # 2
# - Hands request to CMS - web user does not see this behind-the-scenes rewrite
RewriteRule (.*) sapphire/main.php?url=$1&%{QUERY_STRING} [L]
¿Fue útil?

Solución

La bandera L provoca una reinyección de la URL ya reescrita. Intente analizar la URL original solicitada en su lugar:

RewriteCond %{SERVER_PORT} =443
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /Security[/?\ ]
RewriteRule (.*) http://internal/$1 [R=301,L]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top