.htaccess
書き換えルールに問題があります。ユーザーの電子メールから、パスワード リセット用のトークンを含む URL をブラウザーに渡します。
現在の .htaccess
ルール:
オプション FollowSymLinks -MultiViews リライトエンジンオン リライトベース/ RewriteCond %{HTTPS} オフ [OR] RewriteCond %{HTTP_HOST} ^www\.DOMAIN\.com [NC] RewriteRule ^(.*)$ https://DOMIAN.com/$1 [L,R=301] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [L] RewriteCond %{THE_REQUEST} ^(?:GET|POST)\ /.*\.php\ HTTP.*$ [NC] RewriteRule ^(.*)\.php$ $1 [R=301,L]
ユーザーが移動しようとしたとき
example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6
デバッグ中にこれらのエラーが発生する
example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6.php.php.php.php.php.php.php.php.php
そこで、以下のコメントに従い、.htaccess を次のように更新しました。
オプション FollowSymLinks -MultiViews リライトエンジンオン リライトベース/ RewriteCond %{HTTPS} オフ [OR] RewriteCond %{HTTP_HOST} ^www\.EXAMPLE\.com [NC] RewriteRule ^(.*)$ https://EXAMPLE.com/$1 [L,R=301] RewriteCond %{THE_REQUEST} ^(?:GET|POST)\ /.*\.php\ HTTP.*$ [NC] RewriteRule ^(.*)\.php$ $1 [R=301,L] # 拡張子なしの「.php」URL を書き換える RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule (. ) $1.php [L] # 「/<file>/<code>」を「/<file>.php/<code>」に書き換えます RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^([^/] )/([a-f0-9])$ $1.php/$2 [L]次のエラーが表示されます:
AH00128: ファイルが存在しません: /var/www/html/htdocs/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6
このルールの問題は、1 つのファイル システム パス (つまり、
%{REQUEST_FILENAME}\.php
) をチェックし、別のファイル システム パス ($1.php
) に書き換えていることです。 )。これらは必ずしも同じことを意味するわけではありません。/activate/foo
へのリクエスト (activate
がファイル システム ディレクトリではない場合) の場合、REQUEST_FILENAME
の形式は/var/www/html です。 /htdocs /activate
(/var/www/html/htdocs/activate.php
が存在するため、ファイル チェックは成功します) が、リクエストをactivate/foo.php# に書き換えます。 # # (
$1後方参照を使用) - リクエストは存在しません。これを繰り返し実行し、毎回
.phpを追加します (内部書き換え制限に達するまで、デフォルトは 10)。
余談#1: リクエスト .php
がファイルにマップされているかどうかを確認する前に、リクエストがファイルではなくディレクトリにマップされているかどうかを確認する必要はありません。 。ファイルシステム チェックが 1 つだけ必要な場合でも、(高価な) 3 つのファイル システム チェックが行われることになります。
余談#2: これは「通常の」文字列であり、文字列ではないため、TestString (最初のパラメータ) のリテラル ドットをバックスラッシュでエスケープする必要もありません。正規表現。
最終的に書き換えられる同じファイル パスをテストできるように、このルールを修正する必要があります。例えば:#### 拡張子のない「.php」URL を書き換える RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule (. ) $1.php [L]
/activate/
は 16 進数のシーケンスであると仮定しています。あなたの例ではこれが当てはまります。)を
/activate.php/
(
/
## を置き換えます) に書き換える追加のルールが必要です。 # パス情報としてスクリプトに渡されます)。これが 1 回限りの場合は、「ハードコーディング」されている可能性があります。例えば:#### 「/activate/
」を「/activate.php/
」に書き換えます RewriteRule ^(有効化)/([a-f0-9] )$ $1.php/$2 [L]また、同様のリクエストがある場合は、より一般的なものにしてください。例えば。
/<ファイル>/
/<ファイル>.php/
」に書き換えます RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^([^/] )/([a-f0-9] )$ $1.php/$2 [L]に変換します。例えば:###
# 「//
」を「/
.php/このルール (外部リダイレクト) は、
上記の書き換えよりも前にある必要があります。