子文件夹中的Symfony4路由

时间:2018-12-22 11:22:24

标签: .htaccess symfony mod-rewrite

我的/var/www/html/app/中有一个symfony应用程序,我想通过host/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。

/var/www/html/app/.htaccess中的htaccess

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On

    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

使用此.htaccess,当我转到://host/app时,我转到了symfony应用程序(不是apache目录结构),这似乎是一个不错的开始。 但是问题是我收到异常No Routes found for /app/。 这是正常的,因为/app/是服务器中的子文件夹,而不是symfony路由的开始。

如何在/app/文件夹路径之后创建symfony路由?

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

我只希望我的路线在访问://host/app时起作用。

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

时,效果很好

编辑: 新app.conf     别名/ rapp“ / 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
        #RewriteBase /app

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

        RewriteRule ^(?!public/index.php)$ public/index.php$1 [L]

    </IfModule>
</Directory>

2 个答案:

答案 0 :(得分:1)

我设法解决了这个问题!

我不确定配置是否正确,但似乎可以正常工作。

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

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>

当我将RewriteRule之类的网址重写为example.com/app/page-1时,第一个example.com/app/public/index.php/page-1是为了防止内部重写循环。 由于page-1不是目录或文件,因此它将无限循环。 因此,我假设一旦有了/public部分,重写就可以工作了,我们什么都不做就停止了重写,并以[L]标志结束了重写。

但是,我不知道为什么必须删除“最终” public/RewriteRule)中的RewriteRule ^(.*)$ index.php/$1 [L]部分。

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

答案 1 :(得分:0)

问题在于您的 Web服务器的文档根目录(apache将通过url公开的目录)和您的项目的文档根目录(公共目录)是不一样。相反,您的服务器指向项目目录。因此,您必须通过在网址中添加public/来手动进入项目的文档根目录。

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

通过将项目存储在其他位置,然后仅将项目的公共目录符号链接到/var/www/html/app,您可能能够实现目标。这可能需要对您的apache配置进行一些更改,例如添加Options FollowSymLinks

另一种更为详尽的方法可能是使用mod_proxy。配置大致如下所示:

# 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设置和应用程序中都做其他操作,例如确保正确设置了受信任的代理或将ap ProxyPreserveHost On添加到a​​pache设置中,但这大致可以为您指明正确的方向。

编辑:我错过了另一个显而易见的解决方案,使用mod_alias将您的symfony应用程序指向/app

Alias /app /var/www/html/app/public