【问题标题】:.htaccess rewrite condition for specific subpages.htaccess 特定子页面的重写条件
【发布时间】:2022-01-17 05:29:17
【问题描述】:

目前我的 htaccess 代码是这样的:

RewriteCond %{HTTP_HOST} ^websiteone\.ca$ [OR]
RewriteCond %{HTTP_HOST} ^www\.websiteone\.ca$
RewriteRule ^(.*)$ "https\:\/\/websitetwo\.com\/$1" [R=301,L]

这是正确重定向主页,但我也想重定向子页面,目前它们没有重定向。

我不想将所有子页面重定向到新站点上的相应页面,我想将它们单独重定向到特定 URL。总共大约有 10 页。

我的问题是:

  1. 这些斜线在做什么?
  2. 是否可以添加多个重写规则,或者我必须找到一种方法来完成所有操作?我的房东让我添加多个规则,但我在网上阅读可能会导致错误。

这是他们建议我添加的内容(未显示列表中的所有页面):

RewriteCond %{HTTP_HOST} ^websiteone\.ca [OR]
RewriteCond %{HTTP_HOST} ^www\.websiteone\.ca
RewriteRule ^(.*)$ "https\:\/\/websitetwo\.com\/$1" [R=301,NC]

RewriteCond %{HTTP_HOST} ^websiteone\.ca/corporate-responsibility/ [OR]
RewriteCond %{HTTP_HOST} ^www\.websiteone\.ca/corporate-responsibility/$
RewriteRule ^(.*)$ "https\:\/\/websitetwo\.com/corporate-responsibility/\/$1" [R=301, NC, L]

RewriteCond %{HTTP_HOST} ^websiteone\.ca/contact-us/ [OR]
RewriteCond %{HTTP_HOST} ^www\.websiteone\.ca/contact-us/$
RewriteRule ^(.*)$ "https\:\/\/websitetwo\.com/contact-us/\/$1" [R=301, NC, L]

这行得通吗?

【问题讨论】:

  • 对于您要重定向的 URL,您是否总是重定向到新站点上的相同 URL 路径?

标签: apache .htaccess redirect


【解决方案1】:
RewriteCond %{HTTP_HOST} ^websiteone\.ca$ [OR]
RewriteCond %{HTTP_HOST} ^www\.websiteone\.ca$
RewriteRule ^(.*)$ "https\:\/\/websitetwo\.com\/$1" [R=301,L]

这已经将所有(子)页面(不仅仅是主页)重定向到另一个网站的相同 URL 路径。由于您只想在此处重定向主页,因此您应该只匹配空 URL 路径,而不是 any URL 路径。

两个RewriteCond 指令可以合并为一个。

RewriteCond %{HTTP_HOST} ^websiteone\.ca/corporate-responsibility/ [OR]

请注意,HTTP_HOST 服务器变量包含Host HTTP 请求标头的值,即。 主机名。它不包含 URL 路径。所以,上面的条件永远不会匹配。

您应该匹配RewriteRule 模式(第一个参数)中的 URL 路径。

  1. 这些斜线在做什么?

它们是反斜杠转义。需要(在某些情况下)匹配正则表达式中的文字字符。例如。点是一个特殊字符(匹配任何字符),因此必须进行反斜杠转义以匹配文字点。例如。 \.。但是,RewriteRule substitution 字符串中的所有反斜杠都不是必需的。

所以,要只重定向主页,你可以这样写:

# Redirect homepage only
RewriteCond %{HTTP_HOST} ^(www\.)?websiteone\.ca [NC]
RewriteRule ^$ https://websitetwo.com/ [R=301,L]
  1. 是否可以添加多个重写规则,或者我必须找到一种方法来完成所有操作?

是的,您可以添加多个规则...每个重定向一个。由于您只想重定向特定的 URL,因此单独的规则可能是要走的路。

虽然,您似乎确实将要重定向的 URL 重定向到相同的 URL 路径,并且由于您必须检查每个重定向的请求主机名,因此如果您愿意,可以将它们组合成一个规则- 我将在下面包含两个示例。

...但是我在网上阅读可能会导致错误。

好吧,您可能需要确保规则的顺序正确以避免冲突,因为规则是从上到下处理的,并且第一场比赛获胜。但否则,这不会导致错误。 (您无法选择单独的规则,就像您要在应用程序中编写此重定向一样。)

RewriteRule ^(.*)$ "https\:\/\/websitetwo\.com/corporate-responsibility/\/$1" [R=301, NC, L]

我不确定您为什么要在此处捕获 URL 路径并将其 ($1) 附加到目标 URL 的末尾(用双斜杠完成)?这将导致 URL https://websitetwo.com/corporate-responsibility//corporate-responsibility/ - 我敢肯定这不是本意。标志之间的 空格 ([R=301, NC, L]) 也是无效的,会导致错误。

所以,把以上几点放在一起......

解决方案 #1

使用多个规则,您可以这样做:

# Redirect homepage only
RewriteCond %{HTTP_HOST} ^(www\.)?websiteone\.ca [NC]
RewriteRule ^$ https://websitetwo.com/ [R=301,L]

# Redirect "/corporate-responsibility/"
RewriteCond %{HTTP_HOST} ^(www\.)?websiteone\.ca [NC]
RewriteRule ^(corporate-responsibility/)$ https://websitetwo.com/$1 [NC,R=301,L]

# Redirect "/contact-us/"
RewriteCond %{HTTP_HOST} ^(www\.)?websiteone\.ca [NC]
RewriteRule ^(contact-us/)$ https://websitetwo.com/$1 [NC,R=301,L]

$1 反向引用包含从RewriteRule 中的第一个捕获组捕获的字符串模式。 IE。上面示例中的“corporate-responsibility/”或“contact-us/”。

首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。只有在您确认它按预期工作后才更改为 301(永久)。

解决方案 #2

由于您在目标站点重定向到相同的 URL 路径,因此您可以使用正则表达式替换将它们组合成一个规则。例如:

# Redirect homepage, "corporate-responsibility/" or "contact-us/"
RewriteCond %{HTTP_HOST} ^(www\.)?websiteone\.ca [NC]
RewriteRule ^(corporate-responsibility/|contact-us/)?$ https://websitetwo.com/$1 [NC,R=301,L]

尽管如果您有许多(甚至只有 10 个)要重定向的 URL,这可能会变得不可读且容易出错。

解决方案 #3

您也可以这样做,同样使用一条规则:

# Redirect homepage, "corporate-responsibility/" or "contact-us/"
RewriteCond %{HTTP_HOST} ^(www\.)?websiteone\.ca [NC]
RewriteCond %{REQUEST_URI} ^/$ [OR]
RewriteCond %{REQUEST_URI} ^/corporate-responsibility/$ [OR]
RewriteCond %{REQUEST_URI} ^/contact-us/$
RewriteRule ^ https://websitetwo.com%{REQUEST_URI} [NC,R=301,L]

为您要重定向的每个 URL 路径添加一个新的条件RewriteCond 指令),它将重定向到新站点的相同 URL 路径。

注意最后一个条件上没有OR标志。

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 2018-06-15
    • 2013-07-02
    • 2017-07-18
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2023-03-04
    相关资源
    最近更新 更多