我的网站(www.example.com
)有.htaccess
个文件:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$
RewriteRule ^/sub/(.*)$ http://sub.example.com/$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^sub\.example\.com$
RewriteCond %{REQUEST_URI} !^/sub/
RewriteRule ^(.*)$ /sub/$1 [L]
文件夹结构与此类似:
/ root
| .htaccess
| index.php
| / sub
| | more.html
| | cats.jpeg
| | / folder
| | | index.php
.htaccess
文件应该做的是:
/sub/cats.jpeg
时服务sub.example.com/cats.jpeg
(但不要重定向,作为代理)/sub/*
的任何访问权限重定向(301)至sub.example.com/*
现在这种方法很有效,但有时会失败:
sub.example.com/folder
转到sub.example.com/sub/folder/
sub.example.com/folder/
按预期工作为什么呢?你们能帮助我吗?提供更好的解决方案?
答案 0 :(得分:1)
这实际上是由于mod_dir
播放了spoilsport。 mod_dir
检测Request URI是否为目录,如果URI缺少,则添加尾部斜杠。
您正在请求/folder
而没有斜杠。您的重写规则将其重新归结为/sub/folder
,mod_dir
将301
重定向到/sub/folder/
。显然,当您请求sub.example.com/folder/
时,mod_dir
将不会执行任何操作,因为它已在重写的URI sub.example.com/sub/folder/
要解决此问题,请遵循以下规则:
RewriteEngine On
RewriteRule ^sub(/.*)?$ http://sub.example.com$1 [NE,NC,L,R=302]
# adds a trailing slash if rewritten URI is a directory
RewriteCond %{DOCUMENT_ROOT}/sub%{REQUEST_URI} -d
RewriteCond %{HTTP_HOST} ^sub\.example\.com$
RewriteRule ^((?!sub/).*)$ /sub/$1/ [L,NC]
# just rewrite to /sub/<uri>
RewriteCond %{HTTP_HOST} ^sub\.example\.com$
RewriteRule ^((?!sub/).*)$ /sub/$1 [L,NC]