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

PHP 8 に移行した後、htaccess 書き換えルールが機能しない

<p>PHP 7 から PHP 8 に移行した後、URL 書き換えルールに関する問題が発生しました。 </p> <p>htaccess の上に次のコードがあります</p> <pre class="brush:php;toolbar:false;">オプション FollowSymLinks リライトエンジンがオン RewriteBase /baba/ エラードキュメント 404 http://localhost/baba/404.php</pre> <ol> <li>検索ページ:-</li> </ol> <p>次のルールを使用するだけでうまく機能します。 -</p> <pre class="brush:php;toolbar:false;">RewriteRule ^s/([\w-] )/(.*)$ search.php?feq=$1&key=$2 [QSA,L ]</pre> <p>しかし、以下のようなルールをさらに追加すると、これらのページは 404 になります。 </p> <pre class="brush:php;toolbar:false;">RewriteRule ^s/([\w-] )/(.*)/(.*)$ search.php?feq=$1&city= $2&key=$3 [QSA、L] RewriteRule ^s/([\w-] )/(.*)/(.*)/(.*)$ search.php?feq=$1&pro=$2&city=$3&key=$4 [ QSA、L] <ol start="2"> <li>ランディング ページ:-</li> </ol> <p>次のルールを使用するだけでうまく機能します。 -</p> <pre class="brush:php;toolbar:false;">RewriteRule ^([\w-] )$ land.php?name=$1 [QSA,L]</pre> <p>しかし、以下のようなルールをさらに追加すると、CSS と画像が他のページで読み込まれなくなり、それらのページでは 404 が発生します。 </p> <pre class="brush:php;toolbar:false;">RewriteRule ^([\w-] )/(.*)/(.*)$ land.php?name=$1&pro=$2& ;city=$3 [QSA,L] RewriteRule ^([\w-] )/(.*)$ land.php?name=$1&key=$2 [QSA,L] RewriteRule ^([\w-] )/(.*)/(.*) land.php?name=$1&city=$2&key=$3 [QSA,L] RewriteRule ^([\w-] )/(.*)/(.*)/(.*)$ land.php?name=$1&pro=$2&city=$3&key=$4 [QSA, L]

P粉274161593P粉274161593435日前549

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

  • P粉022501495

    P粉0225014952023-09-02 09:45:36

    これは PHP のバージョンとは関係ありません - ルールは明らかに矛盾しています...

    最初のルールの正規表現は一般的すぎるため (/s/foo/ と一致します)、単純に 2 番目のルールを追加すると、最初のルールはすべてのリクエストがキャプチャされます。パスセグメントの数に関係なく、search.php?feq=foo&key= として書き換えられます。正規表現をより具体的にする必要があります。たとえば、文字通り any ではなく、パス セグメント全体のみに一致する場合:

    リーリー

    . (任意) ではなく、[^/] (/ 以外の任意) に注意してください。必須のパス セグメントで (1 つ以上) を使用することもできます。

    元のルールと同様に、key URL パラメーター (つまり、最初のルールの 2 番目のパス セグメントと後続のルールの最後のパス セグメント) は optional です。これは意図的なものですか?

    これらの URL パラメーターで使用できる文字がわかっている場合は、正規表現でこれらの文字を指定して URL をさらに制限する必要があります。そうしないと、(誤って) 書き換えられてしまいます。

    指示の順序を逆にして、当面の問題を解決することもできますが、正規表現がまだ汎用的すぎるため、これは部分的な解決策にすぎません。

    ###上記のように。ただし、クライアント側の HTML でこれらのリソースの相対 URL パスを使用すると、CSS および画像のエラーが発生する可能性があります。異なるパスの深さからリクエストを書き換えているため、静的リソースのルート相対 (または絶対) URL を使用する必要があります。相対 URL は、ブラウザのアドレス バーの URL を基準にして (ブラウザによって) 自然に解決されます。

    (回避策として、

    head セクションの base 要素を設定して、すべての相対 URL がベース URL パス relative に対する相対であることを示すことができます。ただし、これには注意点がないわけではありません。)

    紛失した資産に関する詳細情報:

    • htaccess での URL の書き換え結果に CSS と画像がありません
    • 404 見つかりません - CSS へのリンク、画像が壊れています
    • .htaccess ファイル URL 書き換えルール後の JS および CSS レンダリングの問題
    また、「ランディング ページ」ルールは「検索ページ」ルールの後に

    配置する必要があることにも注意してください。そうしないと、これらのルールも競合します。この競合も、正規表現をより具体的にすることで回避できます。たとえば、「ランディング ページ」の最初のパス セグメント (name URL パラメーターの値) を 1 文字以上ではなく 2 文字以上に設定することで、# との競合を回避します。 /### (検索中)。

    ナレーション:

    これにより、404 エラー ドキュメントへの 302 (一時的) リダイレクトがトリガーされます (404 応答と、実際に 404 をトリガーした URL がマスクされます)。非常に具体的な要件がない限り、これは一般的にお勧めできません。通常、ここではルート相対 URL パスを使用する必要があります。例えば:### リーリー

    /baba/404.php

    は内部サブリクエストを介して提供され、エラー ドキュメント自体はエンド ユーザーに公開されません。

    リダイレクトを使用してリソース不足の問題を解決している場合は、HTML ソース コードで相対 URL を使用しないことについて上記を参照してください。

    返事
    0
  • キャンセル返事