I have a page A.
I want to have a page B which is served as a rewrite of page A using .htaccess
.
Is it possible to redirect page A to page B from .htaccess
or is it going to go into an endless loop?
Webmasters Stack Exchange is a question and answer site for webmasters. It only takes a minute to sign up.
Sign up to join this communityYes, you can certainly do this. However, you do need to be careful of endless redirect/rewrite loops, as you suggest.
You need to use mod_rewrite in .htaccess
. Although, exactly how you implement this can depend on your specific scenario and other directives you may already have in your .htaccess
file(s).
In order to prevent a redirect loop, you typically want to make sure that the external "redirect" from Page A to page B only happens for direct requests (ie. requests the user has made) and not requests that have been internally rewritten by your own directives in .htaccess
.
Commonly this is done by either:
Check the requested URL against THE_REQUEST
server variable. This contains the first line of the request header and contains the full (encoded) URL-path and query string. For example:
GET /PageA.html HTTP/1.1
This does not change throughout the request (ie. is not changed when the request is internally rewritten).
OR, check the REDIRECT_STATUS
environment variable, which is empty on the initial request and contains "200" (as in 200 OK
HTTP response status) after the first successful rewrite. This is arguably cleaner than checking THE_REQUEST
in most cases.
Alternatively, you can use the END
flag (Apache 2.4+), instead of L
(last
) on the internal rewrite to stop all processing, preventing the rewrite engine to start over and retesting the earlier redirect. However, this may not work if you have other rewrites.
For example:
Given that /PageA.html
is the underlying filesystem path that serves the page and /PageB
is the URL the user sees then, in the following order:
Externally "redirect" any direct requests for /PageA.html
to /PageB
Internally "rewrite" any request for /PageB
to /PageA.html
.
In .htaccess
, using mod_rewrite:
RewriteEngine On
# 1. Redirect direct requests for "/PageA.html"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^PageA\.html$ /PageB [R=302,L]
# 2. Rewrite "/PageB" back to the actual filesystem path
RewriteRule ^PageB$ PageA.html [L]
Generally, the external redirect should always go before the internal rewrite.