Apache htaccess-重定向到子文件夹而不更改浏览器URL
我有一个域,其中包含具有web应用程序结构的子文件夹。我在我的根域上添加了一个Apache htaccess-重定向到子文件夹而不更改浏览器URL,apache,.htaccess,redirect,mod-rewrite,url-rewriting,Apache,.htaccess,Redirect,Mod Rewrite,Url Rewriting,我有一个域,其中包含具有web应用程序结构的子文件夹。我在我的根域上添加了一个.htaccess,以指向我的子文件夹web app上的公用文件夹。它工作正常,但当我键入www.example.com时,浏览器URL会更改为www.example.com/subfolder/public,但我希望它不会更改 这是我的.htaccess: RewriteEngine On RewriteRule ^.*$ subfolder/public [NC,L] 编辑 第一个.htaccess用于在子文件夹
.htaccess
,以指向我的子文件夹web app上的公用文件夹。它工作正常,但当我键入www.example.com
时,浏览器URL会更改为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]
对不起,我刚刚意识到发生了什么。它与注释中提到的子目录中的第二个
.htaccess
文件无关
由于public
是文件系统上的一个物理目录,因此在内部重写该目录时需要包含一个尾随斜杠。否则,mod_dir将尝试通过附加斜杠来“修复”URL,这就是外部重定向的来源。(mod_dir隐式触发从子文件夹/public
到子文件夹/public/
的外部重定向)
因此,请在根.htaccess
文件中尝试以下操作:
RewriteRule .* subfolder/public/ [L]
重要的是后面的斜杠。重写规则
模式上的锚(^
和$
)不是必需的,因为您正在匹配所有内容。出于同样的原因,NC
标志也不需要
与往常一样,在测试之前,请确保浏览器缓存已清除
更新#1:上面的单个指令将所有内容(包括静态资源)重写到目录
子文件夹/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
不存在,它将被传递到子文件夹/public/
您当前的指令应该正常工作-它不应该重定向。确保已清除浏览器缓存。(旁白:你也不需要NC
标志)是的,正如我写的那样,它工作得很好,但是broswer上的url发生了变化,我希望重定向请求,而不改变broswer上的url。如果你看到重定向(即浏览器中的url发生了变化),那么其他东西似乎会这样做。单靠上述指令无法实现这种重定向。在.htaccess
中是否有其他指令?沿文件系统路径的任何其他.htaccess
文件?(请注意“外部重定向”和“内部重写”之间的区别。您的代码显示的是重写,而不是重定向。)是的,我有两个不同的.htaccess,一个是我发布在我的domainRoot
上的,然后在子文件夹/public
上,我有另一个.htaccess重定向到正确的文件并完成所有工作,第一个我只用来将请求重定向到第二个,这就是问题所在。子文件夹/public/.htaccess
中的任何mod_rewrite指令将完全覆盖(默认情况下)父.htaccess
文件中的mod_rewrite指令。因此,上述指令甚至没有得到处理。添加另一个.htaccess
文件的内容。通过这种方式,它可以部分地在公用文件夹中加载index.php,而不更改url(我想要的),但现在它无法加载公用文件夹中的静态文件(如:css、js、图像),如果我移动根文件夹中的静态文件,它可能会工作得很好,但是如果可能的话,我不会改变这个结构。你对静态文件使用的URL路径是什么?上述指令将所有内容重写到子文件夹/public/
,如果URL路径从文档根目录开始,则包括静态文件。您可能需要包括与其他.htaccess
文件中使用的类似异常,或者包括对静态文件的额外重写。也许我理解这个问题,但我无法解决它。对于静态文件,我需要重定向到静态文件请求的子文件夹/public/
+路径(例如子文件夹/public/js/myjs.js
你知道怎么做吗?所以你的HTML使用的是src=“subfolder/public/js/myjs.js”形式的相对路径?
# 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]