Despite I’ve searched on the web I didn’t found the answer yet.
I made a simple Symfony project working fine on dev ENV with Symfony server.
I decided to put it on apache server to preview it before some live test but I’ve been facing some issues.
I made a blog part that display nicely without post in it but if I add one (or more) post I have an error on too many redirects. The dev tool says I have a lot of request like this: – blog – blog/ – blog – blog/ – … And crashes.
I used the symfony/apache-pack that gave me the .htaccess:
# Use the front controller as index file. It serves as a fallback solution when # every other rewrite/redirect fails (e.g. in an aliased environment without # mod_rewrite). Additionally, this reduces the matching process for the # start page (path "/") because otherwise Apache will apply the rewriting rules # to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl). DirectoryIndex index.php # By default, Apache does not evaluate symbolic links if you did not enable this # feature in your server configuration. Uncomment the following line if you # install assets as symlinks or if you experience problems related to symlinks # when compiling LESS/Sass/CoffeScript assets. # Options FollowSymlinks # Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve # to the front controller "/index.php" but be rewritten to "/index.php/index". <IfModule mod_negotiation.c> Options -MultiViews </IfModule> <IfModule mod_rewrite.c> RewriteEngine On # Determine the RewriteBase automatically and set it as environment variable. # If you are using Apache aliases to do mass virtual hosting or installed the # project in a subdirectory, the base path will be prepended to allow proper # resolution of the index.php file and to redirect to the correct URI. It will # work in environments without path prefix as well, providing a safe, one-size # fits all solution. But as you do not need it in this case, you can comment # the following 2 lines to eliminate the overhead. RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::2$ RewriteRule .* - [E=BASE:%1] # Sets the HTTP_AUTHORIZATION header removed by Apache RewriteCond %{HTTP:Authorization} .+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] # Redirect to URI without front controller to prevent duplicate content # (with and without `/index.php`). Only do this redirect on the initial # rewrite by Apache and not on subsequent cycles. Otherwise we would get an # endless redirect loop (request -> rewrite to front controller -> # redirect -> request -> ...). # So in case you get a "too many redirects" error or you always get redirected # to the start page because your Apache does not expose the REDIRECT_STATUS # environment variable, you have 2 choices: # - disable this feature by commenting the following 2 lines or # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the # following RewriteCond (best solution) #RewriteCond %{ENV:REDIRECT_STATUS} ="" #RewriteRule ^index.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] # If the requested filename exists, simply serve it. # We only want to let Apache serve files and not directories. # Rewrite all other queries to the front controller. RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ %{ENV:BASE}/index.php [L] </IfModule> <IfModule !mod_rewrite.c> <IfModule mod_alias.c> # When mod_rewrite is not available, we instruct a temporary redirect of # the start page to the front controller explicitly so that the website # and the generated links can still be used. RedirectMatch 307 ^/$ /index.php/ # RedirectTemp cannot be used instead </IfModule> </IfModule>
I use the apache site config following:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName mydomain ServerAlias www.mydomain # Uncomment the following line to force Apache to pass the Authorization # header to PHP: required for "basic_auth" under PHP-FPM and FastCGI # # SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 # For Apache 2.4.9 or higher # Using SetHandler avoids issues with using ProxyPassMatch in combination # with mod_rewrite or mod_autoindex #<FilesMatch .php$> #SetHandler proxy:fcgi://127.0.0.1:9000 # for Unix sockets, Apache 2.4.10 or higher # SetHandler proxy:unix:/path/to/fpm.sock|fcgi://dummy #</FilesMatch> # If you use Apache version below 2.4.9 you must consider update or use this instead # ProxyPassMatch ^/(.*.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/public/$1 # If you run your Symfony application on a subpath of your document root, the # regular expression must be changed accordingly: # ProxyPassMatch ^/path-to-app/(.*.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/public/$1 DocumentRoot "/var/www/html/public" <Directory "/var/www/html/public"> # enable the .htaccess rewrites AllowOverride All Require all granted </Directory> # uncomment the following lines if you install assets as symlinks # or run into problems when compiling LESS/Sass/CoffeeScript assets # <Directory /var/www/project> # Options FollowSymlinks # </Directory> ErrorLog /var/log/apache2/project_error.log CustomLog /var/log/apache2/project_access.log combined Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile SSLCertificateKeyFile </VirtualHost> </IfModule>
(Some parts has been changed/removed like path or domain name)
My blog controller looks like this:
/** * @Route("/blog/articles", name="blog") */ public function index() { $blogpost = $this->getDoctrine() ->getRepository(BlogPost::class) ->findAll(); if (!$blogpost) { $nopblogost = true; } else { $nopblogost = false; } return $this->render('blog/index.html.twig', [ 'controller_name' => 'BlogController', 'page_title' => "mon Blog", 'message' => null, 'page_class' => "path-blogpage", 'blog_empty' => $nopblogost, 'blogpost' => $blogpost ]); } /** * @Route("/blog/post/{id}", name="blogpost") */ public function view($id) { $blogpost = $this->getDoctrine() ->getRepository(BlogPost::class) ->find($id); if (!$blogpost) { $nopblogost = true; } else { $nopblogost = false; } return $this->render('blog/view/index.html.twig', [ 'controller_name' => 'BlogController', 'page_title' => $blogpost->getTitre(), 'message' => null, 'page_class' => "path-blogpage", 'blog_empty' => $nopblogost, 'post' => $blogpost ]); }
Strange fact: When I change the route to “blog/list” by example it works fine Back to “blog” error again.
I don’t understand has some static page are routed as “main” with subpage “main/sub” handled like the blog but without database interaction.
Anyone had the problem?
Advertisement
Answer
Don’t use the rewrite pack,
follow the manual https://symfony.com/doc/current/setup/web_server_configuration.html#apache-with-mod-php-php-cgi
section ‘Apache with mod_php/PHP-CGI’, the config example with the allowOverride none.
<VirtualHost *:80> ServerName domain.tld ServerAlias www.domain.tld DocumentRoot /var/www/project/public DirectoryIndex /index.php <Directory /var/www/project/public> AllowOverride None Order Allow,Deny Allow from All FallbackResource /index.php </Directory> # uncomment the following lines if you install assets as symlinks # or run into problems when compiling LESS/Sass/CoffeeScript assets # <Directory /var/www/project> # Options FollowSymlinks # </Directory> # optionally disable the fallback resource for the asset directories # which will allow Apache to return a 404 error when files are # not found instead of passing the request to Symfony <Directory /var/www/project/public/bundles> DirectoryIndex disabled FallbackResource disabled </Directory> ErrorLog /var/log/apache2/project_error.log CustomLog /var/log/apache2/project_access.log combined # optionally set the value of the environment variables used in the application #SetEnv APP_ENV prod #SetEnv APP_SECRET <app-secret-id> #SetEnv DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name" </VirtualHost>