web-dev-qa-db-ja.com

.htaccessを使用せずにクエリパラメータの後にURLからindex.phpを削除します

クエリパラメータの後でURLからindex.phpを削除したい。

これは私のURLです。

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

クエリパラメータを削除し、次のコマンドを使用してプリティURLに変換しました。

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

これで、私のURLは次のようになります。

http://127.0.0.1/user/report/USERNAME

したがって、このURLへのすべてのリクエストは、プロジェクトのエントリスクリプト、つまりweb/index.phpをポイントします。

以下のルートを使用してデータを取得すると、機能します。

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

しかし、URLからindex.phpを削除して以下のようにアクセスすると、404がスローされます。

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

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>

すべてのルートのルーティングにSymfonyを使用しています。

8
akshaypjoshi

Apache 2.4を使用していて、.htaccessファイルを使用したくない場合(たとえば、パフォーマンス上の理由から)、解決策は、単純に FallBackResource を使用することです。

これだけが必要です:

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

これは Symfonyのドキュメント にも示されています。

1
yivi