我已经尝试了几个小时,并且已经对此有点紧张,所以我可能没有看到明显的效果。
我有两个 WordPress 网站,一个是我的“主页”,人们进入我的域名根目录时会看到它,另一个是私人博客:
www.example.com
和www.example.com/blog
在我的服务器根目录中,我想将两个页面组织在单独的文件夹中,以保持整洁。我将这些文件夹命名为wp-main
和wp-blog
。为了重定向域名,我开始摆弄.htaccess
,但似乎做不到正确 -blog
这就是问题所在。main
按照以下说明操作即可这里,但博客不会加载 WordPress 主题(显示原始内容),也不会重定向到任何子文件夹。如果我删除 的重定向规则main
,博客索引会加载,但仍然不会重定向子文件夹。
有人能帮我吗?
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
## redirect for main
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/wp-main($|/)$
RewriteCond %{REQUEST_URI} !^/blog($|/)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wp-main/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ wp-main/index.php
## redirect for blog
RewriteRule ^blog(.*)$ /wp-blog/$1
</IfModule>
答案1
RewriteCond %{REQUEST_URI} !^/wp-main($|/)$ RewriteCond %{REQUEST_URI} !^/blog($|/)$
您应该删除$
这两个末尾的(字符串末尾锚点)条件模式否则,请求/blog/<something>
将被路由到/wp-main/...
,因为上述条件已满足(因为它才不是匹配模式^/blog($|/)$
)。
考虑反转你的逻辑并重写/blog
(更多具体的URL) 优先。(并使用L
标志来防止额外的处理。)
更新:请尝试以下操作...
我已经反转了逻辑,所以/blog
首先处理这个(更具体URL)。这样就无需明确避免 /blog
重写主站点时。我还假设您只有一个域(我在之前的评论中问过) - 这样就避免了检查Host
标头(即HTTP_HOST
服务器变量)的要求。如果您的帐户中有多个域,那么您当前的指令无论如何都是不完整的。
您不需要<IfModule mod_rewrite.c>
包装器,除非您的网站打算在没有 mod_rewrite 的情况下运行(事实并非如此)。
可能你所需要的只是:
RewriteEngine on
# Rewrite blog site
RewriteRule ^blog/?(.*)$ /wp-blog/$1 [L]
# Rewrite everything else to the main site
RewriteRule (.*) /wp-main/$1 [L]
一些假设:
每个子目录(
/wp-blog
和/wp-main
)都有自己的.htaccess
文件(带有 mod_rewrite 指令) - 这可以防止重写循环。这些 WordPress 安装之外没有静态资源。所有静态资源也将被重写。例如,
/images/foo.jpg
在内部重写为/wp-main/images/foo.jpg
,并/blog/images/foo.jpg
重写为/wp-blog/images/foo.jpg
等。您永远不会在客户端 HTML 中直接引用/wp-main
或。如果在其他位置有共享静态资源(例如,实际文档根目录下的子目录),那么您要么需要额外的文件系统检查(如果要列出的位置太多)或在现有指令之前包含此位置的例外。例如:/wp-blog
/scripts
RewriteRule ^scripts/ - [L]
/blog
和/blog/
(带斜线)都可访问您的博客主页(这样可以避免重写/blog
到您的主站点)。理想情况下,只有/blog/
应该访问您的博客,并且/blog
会重定向到此。这可以通过在博客重写之前进行额外的重定向来实现:# Rewrite blog site RewriteRule ^(blog)$ /$1/ [R=302,L] RewriteRule ^blog/?(.*)$ /wp-blog/$1 [L]
仅当您确定这是您想要的并且确认它正常工作时,才将(临时)更改
302
为(永久)。301 会被浏览器持久缓存。301
.htaccess
然后,相应子目录中的每个文件应采用以下格式:
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
无需指定RewriteBase
或包含子目录RewriteRule
代换。