.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 维护它的情况下才更改此设置。)
我尝试使用简单的 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 维护它的情况下才更改此设置。)