私は次のURLを希望しましたwww.example.com/userprofile.php?username=username
。www.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/username
GETユーザー名 を入力すると次のように表示されます
username.php
あらゆることを試しましたが、解決策が見つかりません。
助けていただければ幸いです。
答え1
www.example.com/username
GETユーザー名を入力すると、次のように表示されます。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,})$