【问题标题】:Avoiding multiple Apache redirects for multiple rules避免多个规则的多个 Apache 重定向
【发布时间】:2015-09-08 17:13:45
【问题描述】:

我需要设置一些重定向来执行一些规则并处理一些 URL 更改。

具体如下:

  1. 如果协议是http,则强制执行https
  2. 如果没有子域或者子域不是www,则强制执行www
  3. 如果域是www.domainA.com,并且路径不是开始/en//fr//de//es/,则强制执行/en/
  4. 如果域是www.domainB.com 并且路径不是开始/b_en//b_fr//b_de//b_es/,则强制执行/b_en/

我一直在努力使这项工作正常进行,以便在任何时候都只发生一个 301,而我们最终不会出现一连串的 301。例如,对http://domainA.com 的请求可能会被重定向 3 次:

  1. http://domainA.com 301 转...
  2. https://domainA.com 301 转...
  3. https://www.domainA.com 301 转...
  4. https://www.domainA.com/en/

但是我无法找到解决方案。

这将存在于.htaccess 文件中。

【问题讨论】:

  • 只有 domainA 和 domainB 可以用于这个 htaccess 吗?因为更容易测试www或者没有子域,用域名...
  • 是的,这个特定的用例需要对我上面的要求列表中的第 3 点和第 4 点进行特定处理。
  • 我明白这一点。但是 1 和 2 仅具有相同且仅 2 个域?
  • 是的,要求 #1 和 #2 对两个域都是通用的,总共只有两个域。
  • 是的,但理想情况下也包括路径,否则我们最终会得到超过 1 个重定向

标签: apache .htaccess redirect http-status-code-301


【解决方案1】:

你可以在你的.htaccess中使用:

# domainA
RewriteCond %{HTTP_HOST} domainA\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/(?:en|fr|de|es) [NC]
RewriteRule ^ https://www.domainA.com/en%{REQUEST_URI} [NE,L,R=301]

# domainB
RewriteCond %{HTTP_HOST} domainB\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/b_(?:en|fr|de|es) [NC]
RewriteRule ^ https://www.domainB.com/b_en%{REQUEST_URI} [NE,L,R=301]

# https & www
RewriteCond %{HTTP_HOST} (?:^|\.)(domainA\.com|domainB\.com)$ [NC]
RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{HTTPS} off
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R=301]

从不超过一个重定向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多