Symfony.htaccess目录索引不工作

Symfony.htaccess目录索引不工作,.htaccess,symfony,production,.htaccess,Symfony,Production,我正在将symfony应用程序部署到生产环境中,我已将symfony应用程序放置在根文件夹中 /var/www/html并已将apache2根目录设置为/var/www/html/web,但.htaccess文件中的DirectoryIndex未重定向到app.php文件 在url xxx.xxx.xx.xx/上,我得到/var/www/html/web文件夹中所有文档的列表,如果我这样做,应用程序将加载 我不明白如何让.htaccess中的DirectoryIndex工作 我一直在研究以下类型

我正在将symfony应用程序部署到生产环境中,我已将symfony应用程序放置在根文件夹中 /var/www/html并已将apache2根目录设置为/var/www/html/web,但.htaccess文件中的DirectoryIndex未重定向到app.php文件

在url xxx.xxx.xx.xx/上,我得到/var/www/html/web文件夹中所有文档的列表,如果我这样做,应用程序将加载

我不明白如何让.htaccess中的DirectoryIndex工作

我一直在研究以下类型的堆叠问题,但它们不适合我:

另一篇文章建议将apache2根目录设置为/var/html而不是/var/html/web,但这也不起作用。因为url xxxx.xxx.xx.xx/deplay目录/var/html的内容

我找到的最接近的解决方案是将app.php文件重命名为index.php,该文件获得了要加载的根url xxx.xxx.xx.xx/,但随后所有的“子”url(如xxxx.xxx.xx.xx/offer/9/Alternance\u apprenticessage\u graphiste\u chez\u egs)都失败,并出现404未找到错误。 这是由于.htaccess文件没有正确重定向url,因为url xxxx.xxx.xx.xx/app.php/offer/9/Alternance\u Apprentissage\u graphiste\u chez\u工作正常

My.htaccess文件如下所示(它是默认生成的文件):

DirectoryIndex app.php
重新启动发动机
RewriteCond%{REQUEST_URI}:$1^(/.+)/(.*):\2$
重写规则^(.*)-[E=基:%1]
RewriteCond%{HTTP:Authorization}。
重写规则。*-[E=HTTP\U授权:%{HTTP:AUTHORIZATION}]
RewriteCond%{ENV:REDIRECT_STATUS}^$
重写规则^app\.php(/(.*)|$)%{ENV:BASE}/$2[R=301,L]
RewriteCond%{REQUEST_FILENAME}-f
重写规则[L]
重写规则.?%{ENV:BASE}/app.php[L]
重定向匹配302^/$/app.php/
谢谢你的帮助。这是至关重要的,因为我无法让我的应用程序继续生产

更新 @谢夫伦的观点是正确的。从他的回答“可能Apache安装程序根本不解析.htaccess文件。”和“检查该目录上的Apache主配置AllowOverride。尝试将其设置为AllowOverride all并重新启动Apache-看看是否有效。”

我做了以下工作:

我将Apache配置设置如下:

 <VirtualHost *:80>
    
     ServerAdmin webmaster@localhost
      DocumentRoot /var/www/html/web
      <Directory "/var/www/html/web">
        AllowOverride All
        Allow from All
      </Directory>
    
      ErrorLog ${APACHE_LOG_DIR}/error.log
      CustomLog ${APACHE_LOG_DIR}/access.log combined
      
   </VirtualHost>

服务器管理员webmaster@localhost
DocumentRoot/var/www/html/web
允许超越所有
通融
ErrorLog${APACHE_LOG_DIR}/error.LOG
CustomLog${APACHE\u LOG\u DIR}/access.LOG组合
这不起作用。 @谢夫伦:我写得不对吗

但是,我进一步将.htaccess文件中的所有配置放在Apache主配置中,这使得重定向工作正常:

  <VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/web
    <Directory "/var/www/html/web">
          AllowOverride All
          Allow from All
    </Directory>

    DirectoryIndex app.php

    <IfModule mod_rewrite.c>
        RewriteEngine On

        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
        RewriteRule ^(.*) - [E=BASE:%1]

        RewriteCond %{HTTP:Authorization} .
        RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

        RewriteCond %{ENV:REDIRECT_STATUS} ^$
        RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule .? - [L]

        RewriteRule .? %{ENV:BASE}/app.php [L]
    </IfModule>

    <IfModule !mod_rewrite.c>
        <IfModule mod_alias.c>
            RedirectMatch 302 ^/$ /app.php/
        </IfModule>
    </IfModule>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

  </VirtualHost>

服务器管理员webmaster@localhost
DocumentRoot/var/www/html/web
允许超越所有
通融
DirectoryIndex app.php
重新启动发动机
RewriteCond%{REQUEST_URI}:$1^(/.+)/(.*):\2$
重写规则^(.*)-[E=基:%1]
RewriteCond%{HTTP:Authorization}。
重写规则。*-[E=HTTP\U授权:%{HTTP:AUTHORIZATION}]
RewriteCond%{ENV:REDIRECT_STATUS}^$
重写规则^app\.php(/(.*)|$)%{ENV:BASE}/$2[R=301,L]
RewriteCond%{REQUEST_FILENAME}-f
重写规则[L]
重写规则.?%{ENV:BASE}/app.php[L]
重定向匹配302^/$/app.php/
ErrorLog${APACHE_LOG_DIR}/error.LOG
CustomLog${APACHE\u LOG\u DIR}/access.LOG组合

因此,现在重定向正在工作。

您的Apache设置可能根本不解析.htaccess文件(实际上,出于性能和安全原因,可能建议单租户生产服务器使用此方法)

在该目录上检查Apache主配置的
AllowOverride
。尝试将其设置为
AllowOverride All
,然后重新启动Apache-看看是否有效

如果有效,我建议将.htaccess文件的内容移动到Apache主配置文件的
部分(最好是在它包含的单独文件中),并设置
AllowOverride None


我发现:这是针对Symfony的,有一些细节,尽管我不知道它是否是最新的,因为我不是Symfony用户

谢谢你的回答。你说得对,我的.htaccess文件没有被解析。因此,当我把所有的配置放在主要的Apache配置中时,我使重定向开始工作,但有一个小问题,重定向不是“静默的”,这意味着“app.php”现在出现在url中!你知道我该怎么去掉它吗?如果问题解决了,那么你就解决了我的问题!我建议您阅读ApacheURL重写指南,如果您仍然无法解决此问题,请发布一个新问题
  <VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/web
    <Directory "/var/www/html/web">
          AllowOverride All
          Allow from All
    </Directory>

    DirectoryIndex app.php

    <IfModule mod_rewrite.c>
        RewriteEngine On

        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
        RewriteRule ^(.*) - [E=BASE:%1]

        RewriteCond %{HTTP:Authorization} .
        RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

        RewriteCond %{ENV:REDIRECT_STATUS} ^$
        RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule .? - [L]

        RewriteRule .? %{ENV:BASE}/app.php [L]
    </IfModule>

    <IfModule !mod_rewrite.c>
        <IfModule mod_alias.c>
            RedirectMatch 302 ^/$ /app.php/
        </IfModule>
    </IfModule>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

  </VirtualHost>