阿帕奇/.htaccess |重写一个 URL 但旧的 URL 仍然存在?

Apache / .htaccess | Rewriting a URL but the old URL still remains?

我的网站设置有点不寻常:

现在我想让用户访问一个新页面 site.tld/mynewpage,它实际上是 WordPress 网站上的一个页面。所以实际的 URL 是 site.tld/blog/mynewpage.

为了实现这一点,我定义了这条规则:

RewriteRule ^mynewpage/$ /blog/mynewpage/ [L]

哪种作品。当我浏览到 site.tld/mynewpage.

时,它让我成功地看到了所需的 wordpress 页面

我的解释是,如果我现在浏览到 site.tld/blog/mynewpage,它会给我一个 404 或者它会“自动重定向”到 site.tld/mynewpage。但是 none 发生了。地址栏仍然显示 site.tld/blog/mynewpage,我正确地看到了那个页面。所以现在我有两个指向 mynewpage 的链接。对于 SEO 这没什么大不了的,因为我可以将规范 URL 设置为 site.tld/mynewpage,但令我困扰的是,这个“旧 URL” site.tld/blog/mynewpage 仍然存在.

有办法解决吗?我天真地尝试从 site.tld/blog/mynewpage 重定向到 site.tld/mynewpage,但这给了我“重定向太多”,我认为这是因为它是一个无限循环。

感谢任何帮助=)

将 301 重定向添加到您的旧 URL - site.tld/blog/mynewpagesite.tld/mynewpage

301 重定向可以通过 .htaccess 添加,如下所示

Redirect 301 /oldurl/ http://www.example.com/newurl/

或者如果您有自定义 php 页面,您可以尝试使用以下代码

<?php
header("Location: https://www.example.com/newurl", true, 301);
exit();
?>

您需要确保您只将“直接”请求重定向回根目录,而不是根 .htaccess 文件中现有重写的 重写 请求(这将导致重定向循环)。

将以下内容添加到 /blog/.htaccess 文件的 top

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^mynewpage/$ /[=10=] [R=301,L]

这假设 URL 有一个尾部斜线,就像在您的“工作”重写指令中一样。但是,您的所有示例都省略了尾部斜线?

乍一看,这可能“看起来”像是重定向到 same URL,但是,因为 .htaccess 文件位于子目录中它确实从重定向的 URL 中删除了子目录。 IE。它从 /blog/mynewpage/ 重定向到 /mynewpage/.

RewriteRule模式匹配URL-路径相对到[=11的位置=] 文件。因此,由于我们位于 /blog 子目录中,因此正则表达式 ^mynewpage/$ 匹配 /blog/mynewpage/ 的请求。我们使用 [=22=] 反向引用重定向回 /mynewpage/,其中包含与 RewriteRule 模式 匹配的 URL 路径.

针对 REDIRECT_STATUS 环境变量的检查确保只有直接请求(来自客户端)被重定向,而不是被现有重写重写的请求。

注意:首先使用 302(临时)重定向进行测试以避免缓存问题。