我的 Symfony 应用程序有问题,该应用程序在两个链接下运行:在我的根目录
example.com
和子文件夹 example.com/public
如何停止在链接
example.com/public
下显示应用程序? .htaccess
中有没有命令可以做到这一点?
根文件夹中我的
.htaccess
:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
RewriteCond %{REQUEST_URI} !^public/ [NC]
RewriteRule ^(.*)$ /public/$1 [QSA,L,NE]
在公共文件夹中我有
.htaccess
,如下所示:在
/public/.htaccess
中,在最顶部创建一个附加规则,将 direct 请求(即尚未重写的请求)重定向回根。
您无法在根
.htaccess
中创建规则来执行此操作,除非您启用/修改mod_rewrite继承,因为当您请求example.com/public/
时,根/父.htaccess
文件中的mod-rewrite指令将被完全覆盖通过 example.com/public/.htaccess
中的 mod_rewrite 指令。
例如:
# /public/.htaccess
# Redirect "direct" requests back to root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /$1 [R=301,L]
对于直接请求,
REDIRECT_STATUS
环境变量为empty,这就是我们在这里测试的内容。 (请求重写成功后设置为(string)200
。)
RewriteRule
pattern 匹配相对于包含 .htaccess
文件的目录的 URL 路径,因此捕获模式 (.*)
排除 public
(父)目录。因此,重定向回 /$1
排除了 /public
前缀。
使用 302(临时)重定向进行测试,以避免潜在的缓存问题,并在测试前清除浏览器缓存。
这也解决了直接访问
/public
子目录时绕过规范重定向(HTTPS 和非 www)的问题(因为如上所述,根目录中的指令被覆盖)。但是,正如所写,在这种情况下,上述内容将触发两个重定向。一个用于 root,第二个用于 HTTPS 和非 www。这是一种边缘情况,但您可以在上述规则中使用绝对 URL 来避免这种情况。例如:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) https://example.com/$1 [R=301,L]