htaccess - 重定向到子文件夹而不更改浏览器URL

时间:2017-01-05 14:57:51

标签: apache .htaccess redirect mod-rewrite

我的域名包含带有网络应用结构的子文件夹。我在我的根域中添加了.htaccess,以指向我的子文件夹Web应用程序上的公用文件夹。它工作正常,但是当我输入www.example.com时,浏览器网址会更改为www.example.com/subfolder/public,但我希望它不会更改。

这是我的.htaccess

RewriteEngine On
RewriteRule ^.*$ subfolder/public [NC,L]

修改

第一个.htaccess用于重定向子文件夹/ p​​ublic,其中还有一个.htaccess可以完成所有工作。

此处第二个.htaccess的代码位于www.example.com/subfolder/public/

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

1 个答案:

答案 0 :(得分:4)

抱歉,刚刚意识到发生了什么。它与子目录中的第二个.htaccess文件无关,如注释中所述。

RewriteRule ^.*$ subfolder/public [NC,L]

由于public是文件系统上的物理目录,因此在内部重写到该目录时需要包含尾部斜杠。否则,mod_dir将尝试通过附加斜杠来“修复”URL - 这是外部重定向的来源。 (mod_dir隐式触发从subfolder/publicsubfolder/public/的外部重定向。)

因此,请在您的根.htaccess文件中尝试以下操作:

RewriteRule .* subfolder/public/ [L]

重要的是尾随斜线。 ^ 模式上的锚点($RewriteRule)不是必需的,因为您匹配所有内容。由于同样的原因,NC标志也不是必需的。

与往常一样,在测试之前确保浏览器缓存已清除。

更新#1:上面的单个指令将所有(包括静态资源)重写到目录 subfolder/public/然后依赖在子目录中的第二个.htaccess文件上正确路由请求。为了允许正确地重写静态资源(在HTML中表示为根目录相对的URL路径,形式为"/js/myjs.js"),那么您将需要其他指令来重写这些资源。

例如,要专门将所有.js.css个文件重写为/subfolder/public/...

中的实际位置
# Rewrite static resources
RewriteRule (.+\.(?:js|css))$ subfolder/public/$1 [L]

# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]

更新#2:为了使上述更通用,并重写任何静态资源(图片,PDF,.txt等...),我们可以检查对于重写之前存在的文件,如:

# Rewrite static resources
RewriteCond %{DOCUMENT_ROOT}/subfolder/public/$1 -f
RewriteRule (.+) subfolder/public/$1 [L]

# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]

这意味着,如果任何.css不存在,则会传递给subfolder/public/