mod重写静默重定向到子目录



我有一个这样的链接:

example.com/site/anyFolderName

我需要在这里重定向(静默):

example.com/site/myFolder/anyFolderName

并且所有子链路都被保留

example.com/site/anyFolderName/(请求)-->example.com/site/myFolder/anyFolderName/example.com/site/anyFolderName/picture.png(请求)-->example.com/site/myFolder/anyFolderName:picture.pngexample.com/site/anyFolderName/index.html(请求)-->example.com/site/myFolder/anyFolderName/index.htmlexample.com/site/anyFolderName/page.php(请求)-->example.com/site/myFolder/anyFolderName/page.php


我的重写规则陷入了无限循环。任何能给我指明正确方向的片段/教程/链接/想法都非常受欢迎!非常感谢

发现这是完全正确的:

"尽管有大量的例子和文档,mod_rewrite就是巫毒。该死的酷巫毒,但仍然是巫毒。"--布莱恩·摩尔

无限循环无疑是因为您正在无休止地匹配myFolder。需要将其从模式中排除。由于匹配模式是PerlCompatibleReguarExpression,因此可以使用负的零宽度断言(?!regex)

将其添加到服务器conf或.htaccess

RewriteEngine On
RewriteRule ^site/((?!myFolder/).*)$ site/myFolder/$1 [L,NC]

这样做:

RewriteEngine on
RewriteBase /
#to prevent looping
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
#To handle trailing slash problem
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(?:.w+|/)$
RewriteRule (.*) /$1/ [R,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(site)(/.*) $1/myfolder$2 [L,NC]

尽管在您的情况下

#to prevent looping
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

将不仅仅是为了上述目的而需要。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

将负责环路终止。

最新更新