htaccess が url.php にリダイレクトされる

htaccess が url.php にリダイレクトされる

私は次のURLを希望しましたwww.example.com/userprofile.php?username=usernamewww.example.com/username
以下は私のhtaccessファイルです。

Options All -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1index [NC,L]
RewriteRule ^([^\.]+)$ $1login [NC,L]
RewriteRule ^(.*)$ userprofile.php?username=$1 [QSA]

www.example.com/usernameGETユーザー名 を入力すると次のように表示されます

username.php

あらゆることを試しましたが、解決策が見つかりません。
助けていただければ幸いです。

答え1

www.example.com/usernameGETユーザー名を入力すると、次のように表示されます。username.php

ファイルの前の部分に書き換えがあるため:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

/username(既存のファイルにマッピングされていないリクエストを)書き換える/username.php 前にこれを に書き換えますuserprofile.php?username=username.php。そのため、GET パラメータ値に.phpサフィックスが付きます。

RewriteRule同様に、前のルールがリクエストをキャッチしているため、次の 2 つのディレクティブは現在何も実行していません。

RewriteRule ^([^\.]+)$ $1index [NC,L]
RewriteRule ^([^\.]+)$ $1login [NC,L]

そして、これらは、拡張子を追加するように前の書き換えを変更した場合に限り、「ユーザー名」の書き換えと競合します.php。しかし、これら 2 つのルールは互いに競合します。つまり、両方で同じ URL が一致しているため、最初のルールが常に優先されます。(1 つの入力に対して 2 つの異なる出力は、どのようなシナリオでも不可能です。) 実際、これにより書き換えループが発生する可能性があります。

これら 2 つの指令は削除する必要があります。


.phpに追加されないようにするには、ファイルが存在するusernameかどうかを確認します。.php前に次のように書き換えます。例:

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

ただし、ユーザー名を具体的に示す URL を簡単にターゲットできるように、URL 構造を変更することも検討してください。例:

www.example.com/u/username

そうすれば、ディレクティブをより明確に記述できます (また、ファイル内のディレクティブの順序にそれほど依存しなくなります)。

RewriteRule ^u/(.*)$ userprofile.php?username=$1 [QSA,L]

また、ユーザー名をキャプチャする正規表現をより具体的にします。パターン.*何でもたとえば、ユーザー名に a から z までの文字のみを含めることができる場合は、 のような正規表現を使用します。ユーザー名が 4 文字以上である必要がある場合は、 のような正規表現を使用します^u/([a-z]+)$^u/([a-z]{4,})$

関連情報