Regex 重定向、代理和重写引擎

Regex 重定向、代理和重写引擎,regex,apache,.htaccess,mod-rewrite,redirect,Regex,Apache,.htaccess,Mod Rewrite,Redirect,我的网站(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/ Rewrit

我的网站(
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.example.com/cats.jpeg
    时提供
    /sub/cats.jpeg
    (但不要重定向,充当代理)
  • 将(301)任何打开
    /sub/*
    的访问重定向到
    sub.example.com/*
现在这种方法基本上是有效的,但有时会失败:

  • sub.example.com/folder
    转到
    sub.example.com/sub/folder/
  • sub.example.com/folder/
    按预期工作

为什么??你们能帮帮我吗?提供更好的解决方案?

嗯,这是一个有点棘手的问题。我不得不重新创建这个目录结构来调查发生了什么

这实际上是由于
mod_dir
玩坏了的运动
mod_dir
检测请求URI是否为目录,如果您的URI缺少一个,则添加一个尾随斜杠

您正在请求不带尾随斜杠的
/文件夹
。您的重写规则将其重写到
/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]
重新编写引擎打开
重写规则^sub(/.*)$http://sub.example.com$1[NE,NC,L,R=302]
#如果重写的URI是目录,则添加尾部斜杠
重写cond%{DOCUMENT_ROOT}/sub%{REQUEST_URI}-d
重写cond%{HTTP_HOST}^sub\.example\.com$
重写规则^((?!sub/).*)$/sub/$1/[L,NC]
#只需重写到/sub/
重写cond%{HTTP_HOST}^sub\.example\.com$
重写规则^((?!sub/).*)$/sub/$1[L,NC]

感谢您的回答,遗憾的是,
sub.example.com/folder
仍然会导致
sub.example.com/sub/folder/
。这只在您的浏览器上有旧缓存。在新浏览器中测试。是的,忘记清除缓存了,谢谢你的帮助。还有,最后一件事,任何对
sub.example.com/sub/folder/
的请求都会得到一个答案,有没有办法阻止?