我有一个这样的链接:
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
将负责环路终止。