htaccess:嵌套的 wordpress 文件夹重定向

htaccess:嵌套的 wordpress 文件夹重定向

我已经尝试了几个小时,并且已经对此有点紧张,所以我可能没有看到明显的效果。

我有两个 WordPress 网站,一个是我的“主页”,人们进入我的域名根目录时会看到它,另一个是私人博客:

www.example.comwww.example.com/blog

在我的服务器根目录中,我想将两个页面组织在单独的文件夹中,以保持整洁。我将这些文件夹命名为wp-mainwp-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 代换

相关内容