【问题标题】:Symfony4 routing inside a subfolderSymfony4 在子文件夹中路由
【发布时间】:2018-12-22 11:22:24
【问题描述】:

我的 /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 路由的开始。

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

我知道在子文件夹中有一些关于 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>

【问题讨论】:

    标签: .htaccess symfony mod-rewrite


    【解决方案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 之类的url 重写为example.com/app/public/index.php/page-1 时出现内部重写循环。 由于page-1 不是目录或文件,它将无限循环。 所以我假设一旦我有一个/public 部分,重写工作,我们什么也不做停止重写,并用[L] 标志结束重写。

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

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

    【讨论】:

      【解决方案2】:

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

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

      您可以通过将项目存储在其他位置然后仅将项目的公共目录符号链接到/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>
      

      正如您所见,内部网络服务器指向您项目的文档根目录(公共目录)。您可能需要在 apache 设置和应用程序中执行额外操作,例如确保正确设置受信任的代理或将ProxyPreserveHost On 添加到 apache 设置中,但大致上这应该为您指明正确的方向。

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

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

      【讨论】:

      • 我尝试添加别名但像这样Alias /app /var/www/html/app 我会尝试别名,这似乎是最简单的方法。它现在在“开发服务器”上,所以不是很重要,这就是为什么我在/var/www/html 中有其他应用程序的原因。非常感谢,我会尽快尝试您的所有建议。
      • 我尝试将Alias 添加到我的配置中,现在我可以通过example.com/app 访问我的应用程序的主页但是所有其他路由都会导致服务器错误(apache 内部错误,与交响乐)。我更新了我的帖子以添加我当前的app.conf
      • 内部错误是由于内部重定向。我将我的RewriteRule 更改为:RewriteRule ^(?!public/index.php)$ public/index.php$1 [L]。但现在我有一个 404 错误。为什么 apache 这么难。
      猜你喜欢
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 2015-08-15
      • 2014-10-05
      • 2021-11-19
      • 2016-03-02
      相关资源
      最近更新 更多