如何配置实现403错误时所有子文件夹重定向至子域名站点?
解决foo子目录触发403时重定向到子域名的配置方案
咱们先理清楚现有配置的逻辑:你设置了Options -Indexes禁止目录索引,所以访问没有index文件的子文件夹会返回403错误;然后用ErrorDocument 403 /403.php把所有403错误导向根目录的403.php页面;最后通过RewriteRule把访问403.php的请求重定向到子域名。
目前访问/foo/folder_1能正常跳转,但要确保所有foo下的子文件夹都能触发这个逻辑,有两种更可靠的配置方式,你可以根据需求选择:
方案一:直接让403错误跳转到子域名(最简洁)
这种方式省去了中转的403.php页面,所有触发403的请求会直接重定向到子域名。修改后的.htaccess内容如下:
Options -Indexes # 直接将403错误指向子域名,默认是302临时重定向 ErrorDocument 403 https://foo.stackoverflow.com/ RewriteEngine on # 若需要301永久重定向,可注释掉上面的ErrorDocument,启用下面两条规则 # RewriteCond %{ENV:REDIRECT_STATUS} ^403$ # RewriteRule ^ https://foo.stackoverflow.com/ [R=301,L]
注意:用
ErrorDocument直接指定外部URL时,Apache默认发送302临时重定向。如果需要301永久重定向,就切换到注释里的Rewrite规则组合,它会捕获所有触发403的请求并完成跳转。
方案二:精准捕获foo下的子目录请求(避免403触发,更流畅)
如果你想让用户访问foo下的子目录时直接跳转,不出现403页面的过渡(减少一次跳转步骤),可以用Rewrite规则直接匹配foo下的目录请求:
Options -Indexes ErrorDocument 403 /403.php RewriteEngine on # 匹配所有foo下的现有目录请求,直接重定向到子域名 RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^foo/ https://foo.stackoverflow.com/ [R=301,L] # 保留原有403.php的重定向,处理其他非foo目录的403情况 RewriteRule ^403.php$ https://foo.stackoverflow.com/ [R=301,L]
这条规则的逻辑是:先判断请求的路径是一个存在的目录(%{REQUEST_FILENAME} -d),如果路径以foo/开头,就直接301重定向到子域名。这样用户访问/foo/folder_1、/foo/folder_2等任何foo下的子目录时,都会直接跳转,体验更顺畅。
两种方案都能满足你的需求,方案一更简洁,方案二更精准且用户体验更好,你可以根据实际情况选择~
内容的提问来源于stack exchange,提问作者FabianoLothor
相关产品推荐
相关产品推荐

