如何停止在公共目录下显示 Symfony 应用程序?

问题描述 投票:0回答:1

我的 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
,如下所示:
https://gist.github.com/alch/7766993

symfony .htaccess mod-rewrite
1个回答
0
投票

/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]
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.