Symfony .htaccess DirectoryIndex 不工作
Symfony .htaccess DirectoryIndex not working
我正在将我的 symfony 应用程序部署到生产环境中,我已将 symfony 应用程序放在根文件夹中
/var/www/html 并将 apache2 根目录设置为 /var/www/html/web 但 .htaccess 文件中的 DirectoryIndex 未重定向到文件 app.php
在 url xxx.xxx.xx.xx/ 上,我得到 /var/www/html/web 文件夹中所有文档的列表,如果我这样做 xxx.xxx.xx.xx/app.php 应用程序加载。
我不明白如何让 .htaccess 中的 DirectoryIndex 起作用。
我一直在研究以下堆栈问题类型,但它们对我不起作用:
- Redirect all requests to web/app.php in Symfony
- Symfony: htaccess to hide app.php or app_dev.php
- symfony2 rewrite rules .htaccess app.php
另一个 post 建议将 apache2 根目录设置为 /var/html 而不是 /var/html/web 但这也不起作用。因为urlxxxx.xxx.xx.xx/显示了目录/var/html
的内容
我找到的最接近的解决方案是将文件 app.php 重命名为 index.php,它获得了要加载的根 url xxx.xxx.xx.xx/,但随后所有'sub' urls(如 xxxx.xxx.xx.xx/offer/9/Alternance_Apprentissage_graphiste_chez_Eggs)失败并出现 404 Not Found 错误。
这是由于 .htaccess 文件没有正确重定向 urls,因为 url xxxx.xxx.xx.xx/app.php/offer/9/Alternance_Apprentissage_graphiste_chez_Eggs 工作正常。
我的 .htaccess 文件如下所示(这是默认生成的文件):
DirectoryIndex app.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI}:: ^(/.+)/(.*)::$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/ [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>
感谢任何帮助。这很关键,因为我无法让我的应用程序继续生产。
更新
@shevron 是对的。从他的回答“您的 Apache 设置可能根本不解析 .htaccess 文件。”和“检查该目录上 AllowOverride 的主要 Apache 配置。尝试将其设置为 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>
这没有用。
@shevron 是我写的不对吗?
但是我进一步将 .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}:: ^(/.+)/(.*)::$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/ [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>
现在重定向正常了。
您的 Apache 设置可能根本不解析 .htaccess 文件(事实上,出于性能和安全原因,这可能被推荐用于单租户生产服务器)。
检查该目录中 AllowOverride
的主 Apache 配置。尝试将其设置为 AllowOverride All
并重新启动 Apache - 看看是否有效。
如果有效,我建议将您的 .htaccess 文件的内容移动到主 Apache 配置文件中的 <Directory>
或 <VirtualHost>
部分(或者更好的是在它包含的单独文件中) 和设置 AllowOverride None
。
我发现了这个:http://symfony-check.org/permalink/optimize-apache-avoid-htaccess 这是 Symfony 特有的一些细节,虽然我不知道它是否是最新的,因为我不是 Symfony 用户。
我正在将我的 symfony 应用程序部署到生产环境中,我已将 symfony 应用程序放在根文件夹中 /var/www/html 并将 apache2 根目录设置为 /var/www/html/web 但 .htaccess 文件中的 DirectoryIndex 未重定向到文件 app.php
在 url xxx.xxx.xx.xx/ 上,我得到 /var/www/html/web 文件夹中所有文档的列表,如果我这样做 xxx.xxx.xx.xx/app.php 应用程序加载。
我不明白如何让 .htaccess 中的 DirectoryIndex 起作用。
我一直在研究以下堆栈问题类型,但它们对我不起作用:
- Redirect all requests to web/app.php in Symfony
- Symfony: htaccess to hide app.php or app_dev.php
- symfony2 rewrite rules .htaccess app.php
另一个 post 建议将 apache2 根目录设置为 /var/html 而不是 /var/html/web 但这也不起作用。因为urlxxxx.xxx.xx.xx/显示了目录/var/html
的内容我找到的最接近的解决方案是将文件 app.php 重命名为 index.php,它获得了要加载的根 url xxx.xxx.xx.xx/,但随后所有'sub' urls(如 xxxx.xxx.xx.xx/offer/9/Alternance_Apprentissage_graphiste_chez_Eggs)失败并出现 404 Not Found 错误。 这是由于 .htaccess 文件没有正确重定向 urls,因为 url xxxx.xxx.xx.xx/app.php/offer/9/Alternance_Apprentissage_graphiste_chez_Eggs 工作正常。
我的 .htaccess 文件如下所示(这是默认生成的文件):
DirectoryIndex app.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI}:: ^(/.+)/(.*)::$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/ [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>
感谢任何帮助。这很关键,因为我无法让我的应用程序继续生产。
更新
@shevron 是对的。从他的回答“您的 Apache 设置可能根本不解析 .htaccess 文件。”和“检查该目录上 AllowOverride 的主要 Apache 配置。尝试将其设置为 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>
这没有用。 @shevron 是我写的不对吗?
但是我进一步将 .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}:: ^(/.+)/(.*)::$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/ [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>
现在重定向正常了。
您的 Apache 设置可能根本不解析 .htaccess 文件(事实上,出于性能和安全原因,这可能被推荐用于单租户生产服务器)。
检查该目录中 AllowOverride
的主 Apache 配置。尝试将其设置为 AllowOverride All
并重新启动 Apache - 看看是否有效。
如果有效,我建议将您的 .htaccess 文件的内容移动到主 Apache 配置文件中的 <Directory>
或 <VirtualHost>
部分(或者更好的是在它包含的单独文件中) 和设置 AllowOverride None
。
我发现了这个:http://symfony-check.org/permalink/optimize-apache-avoid-htaccess 这是 Symfony 特有的一些细节,虽然我不知道它是否是最新的,因为我不是 Symfony 用户。