阿帕奇/.htaccess |重写一个 URL 但旧的 URL 仍然存在?
Apache / .htaccess | Rewriting a URL but the old URL still remains?
我的网站设置有点不寻常:
site.tld
= Gatsby 网站,包含一些静态页面,例如 /example1 和 /example2 等
site.tld/blog
= 一个 WordPress 网站
现在我想让用户访问一个新页面 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/mynewpage
到 site.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(临时)重定向进行测试以避免缓存问题。
我的网站设置有点不寻常:
site.tld
= Gatsby 网站,包含一些静态页面,例如 /example1 和 /example2 等site.tld/blog
= 一个 WordPress 网站
现在我想让用户访问一个新页面 site.tld/mynewpage
,它实际上是 WordPress 网站上的一个页面。所以实际的 URL 是 site.tld/blog/mynewpage
.
为了实现这一点,我定义了这条规则:
RewriteRule ^mynewpage/$ /blog/mynewpage/ [L]
哪种作品。当我浏览到 site.tld/mynewpage
.
我的解释是,如果我现在浏览到 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/mynewpage
到 site.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(临时)重定向进行测试以避免缓存问题。