Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache htaccess-重定向到子文件夹而不更改浏览器URL_Apache_.htaccess_Redirect_Mod Rewrite_Url Rewriting - Fatal编程技术网

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

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用于在子文件夹

我有一个域,其中包含具有web应用程序结构的子文件夹。我在我的根域上添加了一个
.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]