我的域名包含带有网络应用结构的子文件夹。我在我的根域中添加了.htaccess
,以指向我的子文件夹Web应用程序上的公用文件夹。它工作正常,但是当我输入www.example.com
时,浏览器网址会更改为www.example.com/subfolder/public
,但我希望它不会更改。
这是我的.htaccess
:
RewriteEngine On
RewriteRule ^.*$ subfolder/public [NC,L]
第一个.htaccess用于重定向子文件夹/ public,其中还有一个.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]
答案 0 :(得分:4)
抱歉,刚刚意识到发生了什么。它与子目录中的第二个.htaccess
文件无关,如注释中所述。
RewriteRule ^.*$ subfolder/public [NC,L]
由于public
是文件系统上的物理目录,因此在内部重写到该目录时需要包含尾部斜杠。否则,mod_dir将尝试通过附加斜杠来“修复”URL - 这是外部重定向的来源。 (mod_dir隐式触发从subfolder/public
到subfolder/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/
。