将 staging 迁移到 Wordpress 网站中的开发后,相关链接断开

Posted

技术标签:

【中文标题】将 staging 迁移到 Wordpress 网站中的开发后,相关链接断开【英文标题】:Relative links broken after migrating staging to development in Wordpress website 【发布时间】:2018-02-11 13:45:08 【问题描述】:

尝试将托管在某些托管服务提供商上的 Wordpress staging 网站迁移到本地计算机,但相对 url 存在问题。

迁移步骤

1) 克隆站点代码库 2)导入的mysql转储 3) 使用wp-cli 搜索和替换登台站点网址 本地主机/站点

除了一些相对的网址之外,一切似乎都很好。

问题示例

正确的链接

子菜单Travel链接到页面Travel(其slug是travel),所以点击它会重定向到正确的路径siteurl /旅行。 其中 siteurl localhost/site 托管在 /var/www/html/site 中。

链接不正确

小部件区域图像链接 /travel 以某种方式链接到错误的路径 localhost/travel。 它的Settings->General->WordPress地址(URL)和站点地址(URL)分别是:localhost/site

我认为它与 .htaccess 文件或 apache 服务器配置有关。

Localhost站点.htaccess文件内容为:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase /site/ 
RewriteRule ^index\.php$ - [L] 
RewriteCond %REQUEST_FILENAME !-f 
RewriteCond %REQUEST_FILENAME !-d 
RewriteRule . /site/index.php [L] 
</IfModule>

一般来说,我的问题是,需要什么 apache 服务器配置来复制主机上相关链接的行为?因此,像 /link 这样的网站上的相对链接将相对于 wordpress 网站 url (localhost/site/link) 而不是相对于主机 - localhost/链接

【问题讨论】:

您在localhost 上托管了其他网站吗? 是的,localhost 上有网站 【参考方案1】:

因此,网站上的相对链接(如 /link)将相对于 wordpress 网站网址 (localhost/site/link),而不是相对于主机 - localhost/link

网址/link(带有斜杠前缀)是根相对的,而不仅仅是“相对”。这将与文档根目录相关,即。 http://localhost/link 在您的示例中。但是,link(无斜杠前缀)形式的 URL 是 relative - 相对于当前 URL 路径(在浏览器中)。因此,给定 URL http://localhost/site/filelink 形式的相对 URL 将自然(通过浏览器)解析为 http://localhost/site/link - 这在您的示例中似乎是正确的。但是,给定 URL http://localhost/site/path/to/file,相同的相对 URL 将解析为 http://localhost/site/path/to/link - 这可能是不可取的,因此相对链接并不是真正的答案(最好在 URL 重写时避免)。所以,这最终是一个客户端问题——解析相对 URL 路径的是浏览器——而不是服务器。

要解决此问题,您需要更改所有 URL,以便它们正确解析(即,在您的情况下使它们 relative - 尽管这通常是 WordPress 出现问题的原因站点 - 如果您更改了永久链接结构,那么所有链接都会中断),如果您最终将站点移动到另一台服务器,这可能效果不佳。或者更改站点的文档根目录并删除/site 子目录。如果您没有托管来自不同子目录的多个站点,您可以通过在.htaccess 中重写来解决此问题。但是,在您的情况下,这会破坏所有其他在自己的子目录之外运行的网站。

您确实需要在本地开发机器上将单独的站点设置为单独的站点,而不是作为基本上只是单个站点的子目录(即http://localhost/)。这涉及在服务器配置中创建单独的&lt;VirtualHost&gt; 容器,为每个站点定义一个单独的DocumentRoot。您还需要使用本地 HOSTS 文件(或 DNS)将域指向本地开发服务器。

因此,您在 WordPress 中的 站点 URL 会变成类似于 http://local.example.com/ 的东西,它将托管在您的开发机器上的某个位置,例如 /var/www/example.com/public_html

【讨论】:

【参考方案2】:

正如 MrWhite 建议的那样,以下步骤解决了问题:

1) Apacheapache2.conf配置文件中添加vhost块。

NameVirtualHost 192.168.1.10:80
<VirtualHost 192.168.1.10:80>
   ServerName local.site.com
   DocumentRoot "/var/www/html/local.site"
</VirtualHost>
/var/www/html/local.site 是本地机器上所有网站文件所在的文件夹。 local.site.com 是本地网站的域名 VirtualHost 指令有一个明确的 IP 地址,可通过在命令行中运行 ip addr show 来发现一个 IP 地址上的多个基于名称的虚拟主机

2) 将以下条目添加到 /etc/hosts

192.168.1.10 local.site.com

为了符合注释here

在 Apache 服务器上创建虚拟主机配置不会 神奇地导致为这些主机名创建 DNS 条目。你 必须在 DNS 中有名称,解析为您的 IP 地址,或者没有人 否则将能够看到您的网站。你可以在你的 用于本地测试的主机文件,但这只能在机器上工作 与这些主机条目。

3) 使用来自临时网站的相同 .htaccess

它基本上包含以下内容:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
</IfModule>

可能有更多来自安全 wordpress 插件的指令。如果他们使用暂存网站网址,例如:

#AIOWPS_PREVENT_IMAGE_HOTLINKS_START
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %HTTP_REFERER !^$
RewriteCond %REQUEST_FILENAME -f
RewriteCond %REQUEST_FILENAME \.(gif|jpe?g?|png)$ [NC]
RewriteCond %HTTP_REFERER !^http(s)?://site.com [NC]
RewriteRule \.(gif|jpe?g?|png)$ - [F,NC,L]
</IfModule>

RewriteCond %HTTP_REFERER !^http(s)?://site.com [NC] 应替换为RewriteCond %HTTP_REFERER !^http(s)?://local.site.com [NC]

所有步骤都在之后运行:

    将站点代码库克隆到本地开发环境

    将mysql转储导入本地mysql数据库

    使用wp-cli 使用 local.site.com 搜索和替换暂存站点 url

【讨论】:

以上是关于将 staging 迁移到 Wordpress 网站中的开发后,相关链接断开的主要内容,如果未能解决你的问题,请参考以下文章

WordPress 用户迁移到 Rails 设计

如何将 Joomla K2 迁移到 Wordpress

如何将 WordPress 从现场迁移到本地?

将 .sql 数据库迁移到 WordPress

将 LEMP Wordpress 站点手动迁移到子域以进行测试/开发

将 Wordpress 网站迁移到新域