ホームページ  >  に質問  >  本文

.htaccess 書き換えルールの問題

.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

P粉316890884P粉316890884237日前397

全員に返信(1)返信します

  • P粉651109397

    P粉6511093972024-03-20 21:37:57

    このルールの問題は、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/

    /activate.php/ (/ ## を置き換えます) に書き換える追加のルールが必要です。 # パス情報としてスクリプトに渡されます)。これが 1 回限りの場合は、「ハードコーディング」されている可能性があります。例えば:### # 「/activate/」を「/activate.php/」に書き換えます RewriteRule ^(有効化)/([a-f0-9] )$ $1.php/$2 [L]

     (
    は 16 進数のシーケンスであると仮定しています。あなたの例ではこれが当てはまります。)

    また、同様のリクエストがある場合は、より一般的なものにしてください。例えば。 /<ファイル>/

    /<ファイル>.php/ に変換します。例えば:### # 「//」を「/.php/

    」に書き換えます RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^([^/] )/([a-f0-9] )$ $1.php/$2 [L]
    
    ナレーション: 

    このルール (外部リダイレクト) は、

    上記の書き換えよりも前にある必要があります。

    返事
    0
  • キャンセル返事