.htaccess 301 带排除的重定向不起作用

.htaccess 301 redirect with exclusion does not work

我尝试使用简单的 301 重定向 从 domain1.com/folder/domain2.com/

但不包括 domain1.com/folder/subfolder

我在 .htaccess 中使用以下代码:

RedirectMatch 301 ^/folder/((?!subfolder).*)$ https://domain2.com/

但它只是重定向所有请求,包括对子文件夹的请求。

请帮助修复线路,使其按描述工作。谢谢!

这里是.htaccess的完整代码

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /folder/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /folder/index.php [L]
</IfModule>
RedirectMatch 301 ^/folder/((?!subfolder).*)$ https://domain2.com/

尝试使用 mod_rewrite 代替:

(注意:这假定 .htaccess 文件位于文档根目录中。)

# /.htaccess

# Redirect all direct requests, except "subfolder"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond  !^subfolder($|/)
RewriteRule ^folder/(.*) https://domain2.com/ [R=301,L]

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

重定向 在重写您的 front-controller 之前进行很重要。

您需要确保在测试之前清除浏览器缓存并使用 302(临时)重定向进行测试以避免潜在的缓存问题。


更新:

Yes, /folder has it's own .htaccess (this is the file I am working at all this time). Yes, /folder is where Wordpress is installed.

在这种情况下,您需要将上面的重定向更改为如下内容(否则不会执行任何操作):

# /folder/.htaccess

# Redirect all direct requests, except "subfolder"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond  !^subfolder($|/)
RewriteRule (.*) https://domain2.com/ [R=301,L]

基本上,您需要从匹配 URL-path 的正则表达式的开头删除 folder/RewriteRule 模式 匹配的 URL-path 是相对于包含 .htaccess 文件的目录。

增加对 REDIRECT_STATUS 环境变量的检查是为了确保对 WP front-controller 的重写请求(当请求 subfolder 时)不会被重定向。

您还可以“简化”后面的 WordPress 指令(尽管如果这些指令包含在 # BEGIN WordPress / # END WordPress 注释标记中,那么您应该保留指令原样,因为它们由WordPress)。例如:

RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

不需要 RewriteBase 指令。 <IfModule> 包装器也不是。 (但正如我上面所说,只有在 hand-coding 和 .htaccess 并且不让 WordPress 维护它的情况下才更改此设置。)