Apache2 重写规则匹配 HOST 和 URI 以重定向具有相同路径的另一个主机

问题描述 投票:0回答:1

我有 cname,并且将它们直接指向不同的目录。这部分有效。但是,我希望能够重定向 todigra.org/inded.php/dl 至 dl.digra.org/index.php/dl 和 dl.digra.org/index.php/todigra 至 todigra.org/inded.php/todigra

并在重定向中包含 dl 或 todigra 之后的路径。

通过 todigra.org 访问 dl ,反之亦然,我在 seller.google.com 等方面遇到一些有问题的索引。

我尝试过充实。如前所述,前两次重写做了他们应该做的事情,但我不知道如何制定第二个重写

RewriteCond %{HTTP_HOST} ^dl\.digra\.org
RewriteRule ^$ /index.php/dl [R=permanent,L]

RewriteCond %{HTTP_HOST} ^todigra\.org
RewriteRule ^$ /index.php/todigra [R=permanent,L]

RewriteCond %{HTTP_HOST} ^todigra\.org
RewriteRule "^/index.php/dl/(.+)$" "http://dl.digra.org/index.php/dl/$1" [R=permanent,L]

RewriteCond %{HTTP_HOST} ^dl\.digra\.org
RewriteRule "^/index.php/todigra/(.+)$" "http://todigra.org/index.php/todigra/$1" [R=permanent,L]

最后两个重写规则条件对似乎没有做任何事情。我期待这会重写 https://todigra.org/index.php/dl/article/view/1898https://dl.digra.org/index.php/dl/article/view/1898

mod-rewrite apache2
1个回答
0
投票
RewriteCond %{HTTP_HOST} ^todigra\.org
RewriteRule "^/index.php/dl/(.+)$" "http://dl.digra.org/index.php/dl/$1" [R=permanent,L]

RewriteRule
pattern(第一个参数)匹配的URL路径NOT以斜杠开头,因此这两个规则永远不会匹配。但是,它们都不会匹配
/index.php/dl
(甚至
/inded.php/dl/
),因为您的正则表达式仅匹配
/index.php/dl/<something>

您需要执行以下操作:

RewriteCond %{HTTP_HOST} ^todigra\.org [NC]
RewriteRule ^index\.php/dl(/.*)?$ http://dl.digra.org/index.php/dl$1 [R=permanent,L]

现在匹配

index.php/dl
index.php/dl/
index.php/dl/<something>
并重定向到相应的 URL。

请注意,我在反向引用中包含了斜杠,因此它已从 substitution 字符串中删除。

请注意,您正在重定向到 HTTP,而不是 HTTPS?


旁白:

但是,在这种情况下实现外部重定向一开始看起来就是错误的。 看起来您正在从所需的规范 URL 重定向到非规范/隐藏 URL?如果可以的话,

index.php
通常不应出现在可见的 URL 中。它看起来这些应该是内部重写(正如您在上一段中所述,但这可能只是术语的混合?重写/重定向?)加上两个规范的重定向来更正主机名和删除非规范 URL 路径?

您所说的“有效”的前两个重定向仅重定向对根的请求(无 URL 路径),而后两个重定向则处理 URL 路径。这看起来不正确。例如,如果您收到

https://dl.digra.org/<something>
的请求怎么办?

© www.soinside.com 2019 - 2024. All rights reserved.