为什么我的.htaccess重写规则重定向到错误的位置

yuvru6vn  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(161)

这是我的. htaccess文件:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?abc-something-old\.com [NC]
RewriteRule ^(.*)$ https://www.myglobalsite.com/$1 [R,L]

## DIRECTORY
Options +FollowSymLinks
Options All -Indexes

DirectoryIndex index.php
ErrorDocument 404 https://www.myglobalsite.com/

redirectMatch 301 ^/products$ https://www.myglobalsite.com/en/product/drinking-cups
redirectMatch 301 ^/products/vending.php$ https://www.myglobalsite.com/en/product/drinking-cups
redirectMatch 301 ^/products/drinking.php$ https://www.myglobalsite.com/en/product/drinking-cups

问题是当它重定向时,它重定向如下:
来自:https://www.abc-something-old.com/products/vending.php
至:https://www.myglobalsite.com/products/vending.php
应重定向至:https://www.myglobalsite.com/en/product/drinking-cups
是我重写规则的问题吗

7gs2gvoe

7gs2gvoe1#

配置文件(一个“.htaccess”文件是一个“分布式配置文件”)中的指令从上到下处理。
第一个重定向规则将 * 所有 * 请求重定向到新域上的同一个资源路径,这意味着下面的RedirectMatch指令永远不会起作用。
您必须更改指令的顺序,使专门化的,所以更精确的规则到顶部得到应用 * 第一 *。也不要忘记正确键入指令的名称,所以RedirectMatch而不是redirectMatch。更一般的规则,所以通常的捕获所有规则到底部得到应用作为最后一个选项,如果没有专门化的规则得到应用之前。

## DIRECTORY
Options +FollowSymLinks
Options All -Indexes

DirectoryIndex index.php
ErrorDocument 404 https://www.myglobalsite.com/

RedirectMatch 301 ^/products$ https://www.myglobalsite.com/en/product/drinking-cups
RedirectMatch 301 ^/products/vending.php$ https://www.myglobalsite.com/en/product/drinking-cups
RedirectMatch 301 ^/products/drinking.php$ https://www.myglobalsite.com/en/product/drinking-cups

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?abc-something-old\.com [NC]
RewriteRule ^ https://www.myglobalsite.com%{REQUEST_URI} [R,L]

到目前为止,您使用的是别名模块和重写模块的混合指令,您可以将其统一起来,尽管这两种方法都可以工作:

## DIRECTORY
Options +FollowSymLinks
Options All -Indexes

DirectoryIndex index.php
ErrorDocument 404 https://www.myglobalsite.com/
    
RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?abc-something-old\.com [NC]
RewriteRule ^/?products/?$ https://www.myglobalsite.com/en/product/drinking-cups [R,L]
RewriteCond %{HTTP_HOST} ^(www\.)?abc-something-old\.com [NC]
RewriteRule ^/?products/vending\.php$ https://www.myglobalsite.com/en/product/drinking-cups [R,L]
RewriteCond %{HTTP_HOST} ^(www\.)?abc-something-old\.com [NC]
RewriteRule ^/?products/drinking\.php$ https://www.myglobalsite.com/en/product/drinking-cups [R,L]

RewriteCond %{HTTP_HOST} ^(www\.)?abc-something-old\.com [NC]
RewriteRule ^ https://www.myglobalsite.com%{REQUEST_URI} [R,L]

顺便说一句:只有当两个域都由同一个http服务器提供服务,并且使用同一个配置文件来处理请求时,你才需要RewriteCond.否则,如果它们是独立的服务器或者是带有DOCUMENT_ROOT文件夹的独立虚拟主机(我强烈推荐),你可以简化它:

## DIRECTORY
Options +FollowSymLinks
Options All -Indexes

DirectoryIndex index.php
ErrorDocument 404 https://www.myglobalsite.com/
    
RewriteEngine On
RewriteRule ^/?products/?$ https://www.myglobalsite.com/en/product/drinking-cups [R,L]
RewriteRule ^/?products/vending\.php$ https://www.myglobalsite.com/en/product/drinking-cups [R,L]
RewriteRule ^/?products/drinking\.php$ https://www.myglobalsite.com/en/product/drinking-cups [R,L]
RewriteRule ^ https://www.myglobalsite.com%{REQUEST_URI} [R,L]

相关问题