重定向和重写到子域

时间:2019-05-25 作者:Yvonne

我目前正在开发一个新的WordPress网站,以部分取代包含网店的非WP网站。现在,计划是将webshop和所有匹配页面(购物卡、订单确认页面等)迁移到子域,同时将信息页面(如关于我们和联系人)保留在主目录中。主目录上的信息页面将被具有完全相同URL的WordPress页面所取代(一个页面是例外)。

谢天谢地,我不负责迁移,但我的任务是编写正确的重定向。。。这就是我被困的地方。

简而言之,整个新网站的设置如下:

  • https://example.com/
  • https://example.com/about-us/
  • https://example.com/contact/
  • https://example.com/privacy/
  • https://shop.example.com/

    # Redirect this one page to a new url
    Redirect 301 /privacy-statement https://example.com/privacy/
    
    # Make sure these pages and their children aren\'t redirected
    RewriteEngine on
    RewriteCond %{REQUEST_URI}!^/about-us/(.*)
    RewriteCond %{REQUEST_URI}!^/contact/
    
    # Redirect the rest to the new subdomain
    RewriteRule (.*) https://shop.example.com/$1 [R=301,L]
    
    然而,我不确定这是否正确。。。有人能确认它是否正确,或者给出一个关于我应该更改什么的提示吗?

1 个回复
最合适的回答,由SO网友:MrWhite 整理而成

Redirect 301 /privacy-statement https://example.com/privacy/
应避免使用mod\\u别名Redirect 当您已经在为其他重定向使用mod\\u rewrite时,返回指令。mod\\u alias在mod\\u重写之后运行,而不考虑.htaccess 文件,因此可能会发生意外冲突。这应该转换为mod\\u重写(RewriteRule) 改为重定向:

RewriteRule ^privacy-statement$ /privacy/ [R=302,L]
请注意,这会重定向特定URL/privacy-statement, 没什么了(我想这是你需要的)。这个Redirect 指令是前缀匹配的,因此它可能会匹配更多的内容(但源URL和目标URL上的斜杠不匹配,因此这可能会破坏某些内容)。

我假设您正在从/重定向到同一个域,因此我没有将该域包含在替换中。

还要注意,我在这里使用了302(临时)重定向。在更改为301(永久)之前,最好使用302进行测试——如果这是您的意图的话——只有在您确认一切正常后。浏览器会持久缓存301s,因此可能会导致测试出现问题。

# Make sure these pages and their children aren\'t redirected
RewriteEngine on
RewriteCond %{REQUEST_URI}!^/about-us/(.*)
RewriteCond %{REQUEST_URI}!^/contact/

# Redirect the rest to the new subdomain
RewriteRule (.*) https://shop.example.com/$1 [R=301,L]
这看起来基本正常,但是,在RewriteCond 指令-因此这将失败。

这个(.*)的末尾,CondPattern是超级模式。两个正则表达式匹配/about-us/<anything>/contact/<anything> (或者更确切地说,“不匹配”,因为正则表达式是否定的)。

您只需要RewriteEngine 指令在文件中执行一次。它实际上可以去任何地方,甚至在最后,尽管在任何mod\\u重写指令之前,在顶部包含它是合乎逻辑的。(您不应编辑的WordPress前端控制器已包含RewriteEngine On 指令,因此无需重复。但如果你这样做,也没有坏处。)

这些重定向需要在任何WordPress前端控制器之前进行。

总而言之:

RewriteEngine on

# Redirect this one page to a new url
RewriteRule ^privacy-statement$ /privacy/ [R=302,L]

# Make sure these pages and their children aren\'t redirected
RewriteCond %{REQUEST_URI} !^/about-us/
RewriteCond %{REQUEST_URI} !^/contact/

# Redirect the rest to the new subdomain
RewriteRule (.*) https://shop.example.com/$1 [R=302,L]
再次使用302s进行测试。

我假设您的主域和子域指向文件系统上的不同区域(甚至不同的文件系统),否则您将需要一个额外的条件来检查请求的Host 重定向之前。

相关推荐

wp_redirect doen't work

我正在编写一个简单的插件来接受一个用户号码,显示一个包含用户信息的表单,然后发布一个付款金额。用户编号是从这个http文件include\\u once(PLCOA\\u ADMIN\\u PATH.“views/PLCOA payment start.php”)获得的;而且装载得很好。信息表单使用php文件include\\u once(PLCOA\\u ADMIN\\u路径“views/PLCOA payment add.php”)填写;它只有一个字段-表单中的付款金额。当按下提交按钮时,它将运行此功