在Wordpress多站点中使用HTACCESS将子目录添加到WP-CONTENT URL

6
我正在将我的单网站WordPress安装转换为多网站。我试图修复主站点的破损CSS/JS。
我目前在我的网络中有两个网站: - http://www.example.com(主要) - http://dev.example.com(次要)
我的多网站安装位于一个子目录内,我们称之为“wordpress”。所以文件路径看起来像这样:public_html/wordpress。
我的目标是两个站点URL中都没有“wordpress”子目录。除了主站点上的破损CSS和JS外,一切似乎都正常(次要站点看起来很好)。
检查代码时,所有的CSS和JS调用都指向 http://www.example.com/wp-content/ ,但文件在那里找不到。如果我在浏览器中访问 http://www.example.com/wordpress/wp-content ,就可以找到这些文件。我想隐藏wordpress文件夹,仍然能够检索文件。
我对如何设置HTACCESS文件感到困惑。我已经对它进行了一些初始更改,以便使子目录内的多站点工作。这些都是根据我在StackOverflow和其他在线网站上找到的指南来实现的,关于如何将您的网站转移到具有子目录和隐藏子目录的多站点。我没有找到任何关于解决CSS / JS问题的内容。
我认为我需要更新三个HTACCESS文件中的一个或多个。
1)public_html/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/wordpress/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wordpress/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ /wordpress/index.php [L] 
</IfModule>

2.) public_html/wordpress/.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
</IfModule>

3.) public_html/wordpress/wp-content/.htaccess

这个文件原本不存在,但我创建了它。我的想法是文件被调用时没有包含wordpress子目录,但它们需要像包含子目录一样工作。例如,当前http://www.example.com/wp-content/uploads/image.jpg无法访问,但http://www.example.com/wordpress/wp-content/uploads/image.jpg可以。我希望两种路径都能正常工作。

<IfModule mod_rewrite.c>
RewriteEngine on
# ADD WORDPRESS IF URL DOES NOT HAVE IT
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/wordpress/
RewriteRule ^(.*)$ /wordpress/$1
</IfModule>

我尝试在不同的HTACCESS文件中添加不同的行,但它们都没有起作用。我也不确定应该在哪一行插入新规则。有可能我的某个新规则是正确的,但放错了位置。下面是一个我认为会起作用但实际上并没有的规则。

RewriteRule ^/wp-content/(.*)$ /wordpress/wp-content/$1 [R=301,NC,L]

我猜第二个文件是在启用多站点后生成的。如果是这样,正确的位置应该在第一个“htaccess”文件中。你肯定不需要第三个文件。 - BlueSuiter
是的,那是真的。第二个来自我在网上找到的有关启用多站点功能的指南。我删除了第三个htaccess文件,并将代码放入第一个htaccess文件中(即public_html根目录下的文件),但没有任何变化。 - bowlerae
3个回答

3

首先,您应该删除所有 .htaccess 文件,只保留位于根目录下的一个:public_html/.htaccess

其次,您的最后一个规则无法正常工作,因为它略有错误。

您应将其更改为:

RewriteRule ^/wp-content/(.*)$ /wordpress/wp-content/$1 [R=301,NC,L]

To:

RewriteRule ^wp-content/(.*)$ wordpress/wp-content/$1 [L,NC]

因为你不需要以/开头,也不需要进行301重定向。你希望将wordpress文件夹隐藏,并仅将请求的URL从wp-content/(.*)映射到wordpress/wp-content/$1 此外,这个规则必须放在你的.htaccess文件的最前面,以优先于后续默认的Wordpress规则。你的最终和唯一的.htaccess应该如下所示:public_html/
RewriteEngine On
RewriteBase /
RewriteRule ^wp-content/(.*)$ wordpress/wp-content/$1 [L,nc]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

我希望能对您有所帮助。

1
你不需要在子目录中设置多个.htaccess文件。
唯一需要修改的.htaccess文件位于应用根目录中。在你的情况下,它似乎是你的public_html/.htaccess或者public_html/wordpress
现在按照默认设置,WordPress在该目录中生成一个类似以下内容的.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>
# END WordPress

为了重写您的URL,您需要在WordPress代码块之前添加您的RewriteRules。 由于RewriteRules是从上到下处理的,如果请求首先被WordPress块重写为index.php,则您的规则将永远不会被处理。
因此,您的RewriteRule应该放置在WordPress代码块之前:
RewriteRule ^/wp-content/(.*)$ /wordpress/wp-content/$1 [R=301,NC,L]

如果将它放在根目录的.htaccess文件顶部,应该就足够了,并且删除子目录中的.htaccess文件。


0

大多数的多站点网络都安装在您网站的根目录中。这意味着,如果您的服务器使用example.com,则这将是您在网络上的基本站点的URL。

如果您已经在子目录中安装了WordPress Multisite,则无法使用子域。

如果您已经在example.com上安装了单个站点,并在运行Multisite的子目录中添加了另一个WordPress安装,则其地址将为example.com/wordpress。

您在新网络上创建的任何站点都将位于example.com/wordpress/my-new-site。在此创建子目录将是不可能的,因为它必须位于类似example.com/wordpress/my-new-site.network的地址上,这是行不通的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接