.htaccess 子文件夹内的Symfony4路由

.htaccess 子文件夹内的Symfony4路由,.htaccess,symfony,mod-rewrite,.htaccess,Symfony,Mod Rewrite,我的/var/www/html/app/中有一个symfony应用程序,我想通过主机/app/访问它,但我无法让它工作 I have a conf file with this <Directory /var/www/html/app> AllowOverride All Order Allow,Deny Allow from All <IfModule mod_rewrite.c> Options -MultiV

我的
/var/www/html/app/
中有一个symfony应用程序,我想通过
主机/app/
访问它,但我无法让它工作

I have a conf file with this

<Directory /var/www/html/app>

    AllowOverride All
    Order Allow,Deny

    Allow from All

    <IfModule mod_rewrite.c>

        Options -MultiViews
        RewriteEngine On

#       RewriteCond %{REQUEST_FILENAME} !-f
#       RewriteCond %{REQUEST_FILENAME} !-d

#       RewriteRule ^(.*)$ public/$1 [L]

    </IfModule>
</Directory>
使用这个.htaccess,当我转到
://host/app
时,我转到symfony应用程序(而不是apache目录结构),这似乎是一个好的开始。 但问题是我遇到了一个异常,
没有找到/app/
的路由。 这很正常,因为
/app/
是我的服务器中的子文件夹,而不是symfony路由的开始

如何使symfony路由从
/app/
文件夹路径之后开始

我知道在子文件夹中有一些关于symfony2/3路由的问题,但是答案需要将
src
public
文件分开,这不是我想要的

我只希望我的路由在访问
://主机/app
时工作

关于信息,当我访问
://host/app/public/*Symfony routes*

编辑: 新建
app.conf
别名/rapp”/var/www/html/app/public“


不允许超限
命令允许,拒绝
通融
选项-多视图
重新启动发动机
#重写库/应用程序
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则^(?!public/index.php)$public/index.php$1[L]

问题在于web服务器的文档根目录(apache将通过url公开的目录)和项目的文档根目录(公共目录)不相同。相反,您的服务器指向项目目录。这就是为什么您必须通过向url添加
public/
来手动进入项目的文档根目录

您应该避免使项目目录可访问,因为这可能会暴露您的配置,从而使您的网站易受攻击,例如,通过配置中的凭据允许用户访问您的数据库

您可以通过将项目存储在其他地方,然后只将项目的公共目录符号链接到
/var/www/html/app
来实现目标。这可能需要对apache配置进行一些更改,例如在ymlinks之后添加
选项

另一种更复杂的方法是使用
mod\u代理
。配置大致如下所示:

# Your public server reachable from the outside
<VirtualHost *:80>
    ProxyPass /app http://127.0.0.1:8080/
</VirtualHost>

# Your internal server where the requests are proxied to
<VirtualHost 127.0.0.1:8080>
    <Directory /var/www/html/app/public>
        AllowOverride All
        Order Allow,Deny

        Allow from All
    </Directory>
    ...
</VirtualHost>

问题在于web服务器的文档根(apache将通过url公开的目录)和项目的文档根(公共目录)不相同。相反,您的服务器指向项目目录。这就是为什么您必须通过向url添加
public/
来手动进入项目的文档根目录

您应该避免使项目目录可访问,因为这可能会暴露您的配置,从而使您的网站易受攻击,例如,通过配置中的凭据允许用户访问您的数据库

您可以通过将项目存储在其他地方,然后只将项目的公共目录符号链接到
/var/www/html/app
来实现目标。这可能需要对apache配置进行一些更改,例如在ymlinks
之后添加
选项

另一种更复杂的方法是使用
mod\u代理
。配置大致如下所示:

# Your public server reachable from the outside
<VirtualHost *:80>
    ProxyPass /app http://127.0.0.1:8080/
</VirtualHost>

# Your internal server where the requests are proxied to
<VirtualHost 127.0.0.1:8080>
    <Directory /var/www/html/app/public>
        AllowOverride All
        Order Allow,Deny

        Allow from All
    </Directory>
    ...
</VirtualHost>

我设法解决了这个问题

虽然我不确定配置是否“正确”,但它似乎可以工作

这是我的工作
app.conf
文件(在
/etc/apache2/sties enabled/app.conf
中)

Alias/app”/var/www/html/app/public”
不允许超限
命令允许,拒绝
通融
选项-多视图
重新启动发动机
重写规则(/public)-[L]
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则^(.*)$index.php/$1[L]
第一个
RewriteRule
是在我将url(如
example.com/app/page-1
重写到
example.com/app/public/index.php/page-1
时防止内部重写循环。 由于
page-1
不是一个目录或文件,它将无限循环。 所以我假设只要我有一个
/public
部分,重写就开始了,我们什么也不做就停止重写,并用
[L]
标志结束重写

我不明白为什么我必须删除“final”
RewriteRule
RewriteRule^(.*)$index.php/$1[L]
)中的
public/
部分


如果有人有改进此配置的想法,请随时发表评论。

我设法解决了问题

虽然我不确定配置是否“正确”,但它似乎可以工作

这是我的工作
app.conf
文件(在
/etc/apache2/sties enabled/app.conf
中)

Alias/app”/var/www/html/app/public”
不允许超限
命令允许,拒绝
通融
选项-多视图
重新启动发动机
重写规则(/public)-[L]
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则^(.*)$index.php/$1[L]
第一个
RewriteRule
是在我将url(如
example.com/app/page-1
重写到
example.com/app/public/index.php/page-1
时防止内部重写循环。 由于
page-1
不是一个目录或文件,它将无限循环。 所以我假设只要我有一个
/public
部分,重写就开始了,我们什么也不做就停止重写,并用
[L]
标志结束重写

我不明白为什么我必须删除“final”
RewriteRule
RewriteRule^(.*)$index.php/$1[L]
)中的
public/
部分

如果有人有改进此配置的想法,请随时发表评论。

我试图添加别名
# Your public server reachable from the outside
<VirtualHost *:80>
    ProxyPass /app http://127.0.0.1:8080/
</VirtualHost>

# Your internal server where the requests are proxied to
<VirtualHost 127.0.0.1:8080>
    <Directory /var/www/html/app/public>
        AllowOverride All
        Order Allow,Deny

        Allow from All
    </Directory>
    ...
</VirtualHost>
Alias /app /var/www/html/app/public
Alias /app "/var/www/html/app/public"

<Directory /var/www/html/app>

    AllowOverride None
    Order Allow,Deny

    Allow from All

    <IfModule mod_rewrite.c>

        Options -MultiViews
        RewriteEngine On

        RewriteRule (/public) - [L]

        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d

        RewriteRule ^(.*)$ index.php/$1 [L]

    </IfModule>
</Directory>