skip to Main Content

I’m using a shared host with cPanel control panel. I installed Symfony 6 in a subdomain. I’m a total beginner trying to explore and learn the Symfony framework and build something small.

I following a tutorial course trying to make my first page.

I made a php file in /src/Controller/ folder with this code:

<?php
namespace AppController;

use SymfonyComponentHttpFoundationResponse;

class LuckyController
{
    public function number(): Response
    {
        $number = random_int(0, 100);

        return new Response(
            '<html><body>Lucky number: '.$number.'</body></html>'
        );
    }
}

And added this to /config/routes.yaml

app_lucky_number:
    path: /page
    controller: AppControllerLuckyController::number

According to the toturial course, there should be a new page in mydomian.com/page, but entering this URL redirects me to mydomian.com/public/index.php. I realized later that the new page is found with this URL mydomian.com/public/index.php/page.

My question is why does URLs redirect to /public/index.php?
And how can I remove /public/index.php from pages URLs?

Edit: I did as kniziol suggested. I didn’t figure out how to modify the website files remotely. So I downloaded symfony files from cPanel to my local machine, then installed symfony/apache-pack, then re-uploaded it to cPanel. The problem now is URLs redirect to /public/, for example: mydomian.com/public/page. Only the /index.php was removed from URL.

The new .htaccess file in /public folder contains this:

# 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>
    # This Option needs to be enabled for RewriteRule, otherwise it will show an error like
    # 'Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden'
    Options +FollowSymlinks

    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>

2

Answers


  1. If you’re running Apache on the hosting, install symfony/apache-pack:

    composer require symfony/apache-pack
    

    You’ll get .htaccess file in the public/ directory that contains the needed rewrite rules. See more details on the Configuring a Web Server documentation page.

    Login or Signup to reply.
  2. Change your document root by following this steps

    To solve the problem:

    1. You first need to rename your ".htaccess" file to somethings like ".htaccess.bak" to avoid autoredirection.
    2. After that just change your document root from "/public_html/[your-project-name]" to "/public_html/[your-project-name]/public" and come back to the public folder and rename the ".htaccess.bak" to ".htaccess",
    3. Then reload the page and if you are on an "/public/~" url your will get an 404 error if you haven’t defined any "/public" route.
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search