重定向 301 附加旧的 URL 和新的 URL

Redirect 301 appending old URL with New URL

我在重定向 URL 已更改的页面时遇到问题,但我希望将旧 URL 重定向到新页面。这是.htaccess文件

<IfModule mod_security.c>
  SecFilterEngine Off
  SecFilterScanPOST Off
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/system.*
RewriteRule ^(.*)$ index.php?/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?/ [L]
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/ [R,L]

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ https://example.com/ [L,R=301]

RewriteEngine On
RewriteRule ^contactus/$ http://example.com/contact-us/ [R=301,L]

在最后一行使用 mod_rewrite 我没有被重定向到新的 URL 但是当我使用 mod_alias(重定向)规则时我被重定向到新的 URL但是 Old URL 以这种格式附加到其中。

https://example.com/contact-us/?/contactus/

我在 Stack Overflow 上搜索了这个问题的解决方案,并尝试了许多类似的方案,但都没有用。

按给定的顺序排列。

RewriteEngine On

RewriteCond %{SERVER_PORT} 80
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,NE,L]

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]

RewriteRule ^contactus/$ /contact-us/ [R=301,NC,L]

RewriteCond %{REQUEST_URI} ^/system [NC]
RewriteRule ^(.*)$ index.php?/ [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?/ [L]

RewriteEngine On 在同一个 .htaccess 中不需要多次。

确保在测试更改之前清除浏览器缓存。

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/ [R,L]

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ https://example.com/ [L,R=301]

RewriteEngine On
RewriteRule ^contactus/$ http://example.com/contact-us/ [R=301,L]

您的 mod_rewrite 外部重定向(最后三个规则)位置错误。这些需要 before 内部重写(前端控制器)。通过将它们放在文件的末尾,它们将永远不会为静态资源以外的任何 URL 进行处理,因为所有其他 URL 都被路由到 index.php,此时处理停止。

when I use mod_alias(Redirect) rule I get redirected to new URL but Old URL gets appended

无论配置文件中指令的顺序如何,不同的模块都是独立处理的。 mod_alias 在 mod_rewrite 之后被处理 - 但它已被处理。但是,Redirect 指令是前缀匹配,匹配后的所有内容都附加到目标 URL.

的末尾

并且无需重复 RewriteEngine 指令

你的指令是这样的:

<IfModule mod_security.c>
  SecFilterEngine Off
  SecFilterScanPOST Off
</IfModule>

RewriteEngine On

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/ [R=301,L]

RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/ [L,R=301]

RewriteRule ^contactus/$ http://example.com/contact-us/ [R=301,L]

RewriteCond %{REQUEST_URI} ^/system
RewriteRule ^(.*)$ index.php?/ [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?/ [L]

并确保在测试前清除浏览器缓存。最好使用 302(临时)重定向进行测试以避免缓存问题。