web-dev-qa-db-fra.com

Supprimez index.php de l'URL après les paramètres de requête sans utiliser .htaccess

Je veux enlever index.php de mon URL après les paramètres de requête.

Ceci est mon URL:

http://127.0.0.1/user/report?user=USERNAME

J'ai supprimé les paramètres de requête et les ai convertis en une jolie URL en utilisant:

RewriteCond %{QUERY_STRING} !user=
RewriteRule ^([a-zA-Z0-9\-]+)/(.*)$ $2?user=$1 [L,QSA]
RewriteRule ^([a-zA-Z0-9\-]+)$ ?user=$1 [L,QSA]

Maintenant, mon URL ressemble à ceci:

http://127.0.0.1/user/report/USERNAME

Ainsi, toutes les requêtes adressées à cette URL pointeront vers le script d'entrée de mon projet, c'est-à-dire web/index.php.

Lorsque j'utilise les itinéraires ci-dessous pour obtenir des données, cela fonctionne:

http://127.0.0.1/user/report/Default/index.php/api/registration/user-registrations/

Mais quand je supprime index.php à partir de l'URL et accédez-y comme ci-dessous, il lance 404:

http://127.0.0.1/user/report/Default/api/registration/user-registrations/

Fichier de configuration Apache:

Alias /user/report /path/to/project/web/
<Directory /path/to/project/web/>
    AllowOverride All
    Require all Granted
    RewriteOptions AllowNoSlash

    RewriteEngine On
    RewriteBase /user/report/
    RewriteOptions AllowNoSlash

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^[^.]+[^\/]$ $0\/ [R]

    RewriteCond %{QUERY_STRING} !user=
    RewriteRule ^([a-zA-Z0-9\-]+)/(.*)$ $2?user=$1 [L,QSA]
    RewriteRule ^([a-zA-Z0-9\-]+)$ ?user=$1 [L,QSA]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.+)\.(\d+)\.(bmp|css|cur|gif|ico|jpe?g|m?js|png|svgz?|webp|webmanifest|pdf)$ $1.$3 [L]
</Directory>

J'utilise Symfony pour acheminer toutes mes routes.

8
akshaypjoshi

Si vous utilisez Apache 2.4 et que vous ne souhaitez pas utiliser .htaccess (par exemple pour des raisons de performances), la solution est simplement d'utiliser un oneliner: FallBackResource .

Vous n'auriez besoin que de ceci:

<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>

    # 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>
        FallbackResource disabled
    </Directory>
</VirtualHost>

Ceci est même montré dans documentation de Symfony .

1
yivi