One of the frequently encountered issues with app service is
incorrect redirect URLs. This might mean that the app service URL is exposed in
a browser when there’s a redirection or the authentication and authorization
for the app service is broken because of a redirect with the wrong hostname. The
root-cause for this symptom is a setup that overrides the hostname as used by
the application gateway towards app service into a different hostname as is
seen by the browser. This hostname is typically overridden to the default
“azurewebsites.net” domain. In such cases, the application gateway must either
have a “pick hostname from backend address” enabled in HTTP Settings or have an
“Override with specific domain name” set to a value different from what the
browser request has.
The typical resolution for this symptom is to rewrite the
location header. The application gateway’s domain name is set as the host name
in the location header. A rewrite rule is added to do just that and specified
with a condition that evaluates if the location header in the response contains
azurewebsites.net.
When the Azure AppService sends a redirection response, it
uses the same hostname in the location header of its response as the one in the
request it receives from the application gateway. This makes a client redirect
to contoso.azurewebsites.net/path2 instead of going through the application
gateway. This bypass is not desirable. Setting the location header to the
application gateways’ domain name resolves this situation.
The steps for replacing the hostname are as follows:
First, a rewrite rule is written with a condition that
evaluates if the location header in the response contains azurewebsites.net.
The pattern for this can be specified in PCRE format as
(https?):\/\/.*azurewebsites\.net(.*)$
Second, the location header is rewritten to include the
application gateways’ hostname. This is done by entering
{http_resp_Location_1}://contoso.com{http_resp_Location_2} as the header value.
Alternatively, we can also use the server variable ‘host’ to set the hostname
to match the original request.
This manifests as an If-Then condition-action pair. The If
section specifies the type of variable to check as an HTTP header, the header
type as Response, the header name as a Common Header, the name of the Common
Header as the Location, the case-sensitivity turned off, the operator to
evaluate as an equals-to and the pattern to match as
(https?):\/\/.*azurewebsites\.net(.*)$. The Then Section specifies the action
type as Set, the Header Type as Response, the Header name as Common Header, the
name of the Common Header as Location, and the Header Value as
{http_resp_Location_1}://contoso.com{http_resp_Location_2}
This completes the rewrite. Care must be taken to ensure the
appropriate use of rewrite versus redirect.
A URL is rewritten by the application gateway before it is
sent to the backend. It won’t change what the user sees in the browser because
the changes are hidden from the user. A URL is redirected by the application
gateway to a new URL and sent as a response to the client. The URL that the
user sees in the browser will update to a new URL.
No comments:
Post a Comment