通配符从子域根文件夹重定向到子域子文件夹

时间:2017-01-28 13:11:48

标签: apache .htaccess redirect

所以我最近将子域中的所有文件分类到不同的文件夹中,我们只需将其称为upload.example.org。其中一个新文件夹标题为“img”(public_html/upload/img),我现在可以自动上传我拍摄的任何照片以方便共享。以前所有图像都在文档根文件夹“upload”中,这是我用来共享URL的位置,因此需要重定向到新URL以避免破坏任何内容。

现在,我一直在努力创建一个.htaccess,将人们从upload.example.org/image.jpg重定向到upload.example.org/img/image.jpgimage.jpg可以替换为img文件夹中的任何其他文件名。

寻找答案,我发现了这个:

RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

在我的子域中使用这行代码会导致循环,最后将我重定向到http://upload.example.org/img/img/img/img/img/img/img/img/img/img/image.jpg

在搜索并尝试不同的.htaccess变体后,我无法找到正确的解决方案。

非常感谢您提供的任何帮助! :)

1 个答案:

答案 0 :(得分:0)

循环的原因是因为在重定向之后,客户端请求新的URL并再次重定向此新URL,从而导致来自客户端的新请求以及重定向,等等......

为避免这种情况,您必须在规则前加上一个停止条件,例如

RewriteRule ^img/ - [L]

如果请求的网址已经以img/开头,则会导致退出重写链。

另一种方法是首先测试img文件夹中是否存在适当的文件,只有在存在时才重定向。

RewriteCond /img/$1 -f
RewriteRule ^(.*)$ ^img/$1 [R,L]

如果要从任何重写中排除文件夹,请使用停止条件规则,如上例

中所示
RewriteRule ^path/to/some/folder - [L]

这确保了任何以给定URL路径开头的请求都会被重写或重定向。

如果只想要img规则的例外,则可以向规则添加另一个条件,该条件检查生成的路径是否在此其他文件夹中,例如。

RewriteCond /img/$1 -f
RewriteCond /img/excluded/folder/$1 !-f
RewriteRule ^(.*)$ ^img/$1 [R,L]

如果图像存在于img子文件夹中的某个位置,则首先检查这些条件,然后确保它不是img/excluded/folder中的文件。

不相关,但从不使用R=301进行测试!如果一切正常,您可以将R替换为R=301