In the same domain, I want to make a 301 redirect from /this/old/path/file.pdf
to /this/new/path#abc
I tried this:
Redirect 301 /this/old/path/file.pdf /this/new/path#abc
And it does the redirect but showing the following path:
/this/new/path#abc?/this/old/path/file.pdf
It should be:
/this/new/path#abc
Any hint of what is wrong here?
---Update This is the content of my .htaccess file usign just redirect
RewriteOptions inherit
Options FollowSymLinks
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
Redirect 301 /this/old/path/file.pdf /this/new/path#abc
</IfModule>
And usign RewriteRule
RewriteOptions inherit
Options FollowSymLinks
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteCond %{HTTP_HOST} ^mydomain.com$
RewriteRule /this/old/path/file.pdf /this/new/path#abc [NE,R=301]
</IfModule>
This doesn't make any redirect
Don't know if this is important but I am using CPanel.
CodePudding user response:
The Redirect
(mod_alias) directive is applied after the mod_rewrite RewriteRule
directives, so you are seeing the query string that is applied by the earlier RewriteRule
internal rewrite. You basically have a conflict between mod_alias and mod_rewrite.
You need to use a mod_rewrite RewriteRule
directive instead before your existing rules, immediately after the RewriteEngine
directive. Not at the end. The order is important.
For example:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com [NC]
RewriteRule ^this/old/path/file\.pdf$ /this/new/path#abc [NE,R=301,L]
Note that the URL-path matched by the RewriteRule
pattern does not start with a slash. The first argument to the RewriteRule
directive (the pattern) is a regex, so the necessary escaping and anchors need to be applied.
The condition that checks against the HTTP_HOST
server variable is necessary if you need this rule to apply only to the stated domain.
The NE
flag is required to prevent the #
character being URL-encoded in the response (negating its meaning a fragment identifier delimiter).
You will need to clear your browser cache before testing. And test first with 302 (temporary) redirect to avoid potential caching issues.