PHP 7 から PHP 8 に移行した後、URL 書き換えルールに関する問題が発生しました。
htaccess の上に次のコードがあります
オプション FollowSymLinks リライトエンジンがオン RewriteBase /baba/ エラードキュメント 404 http://localhost/baba/404.php
次のルールを使用するだけでうまく機能します。 -
RewriteRule ^s/([\w-] )/(.*)$ search.php?feq=$1&key=$2 [QSA,L ]
しかし、以下のようなルールをさらに追加すると、これらのページは 404 になります。
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]
- ランディング ページ:-
次のルールを使用するだけでうまく機能します。 -
RewriteRule ^([\w-] )$ land.php?name=$1 [QSA,L]しかし、以下のようなルールをさらに追加すると、CSS と画像が他のページで読み込まれなくなり、それらのページでは 404 が発生します。
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]
これは 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に対する相対であることを示すことができます。ただし、これには注意点がないわけではありません。)配置する必要があることにも注意してください。そうしないと、これらのルールも競合します。この競合も、正規表現をより具体的にすることで回避できます。たとえば、「ランディング ページ」の最初のパス セグメント (name
ナレーション:URL パラメーターの値) を 1 文字以上ではなく 2 文字以上に設定することで、# との競合を回避します。 /### (検索中)。
これにより、404 エラー ドキュメントへの 302 (一時的) リダイレクトがトリガーされます (404 応答と、実際に 404 をトリガーした URL がマスクされます)。非常に具体的な要件がない限り、これは一般的にお勧めできません。通常、ここではルート相対 URL パスを使用する必要があります。例えば:### リーリー
/baba/404.phpは内部サブリクエストを介して提供され、エラー ドキュメント自体はエンド ユーザーに公開されません。
リダイレクトを使用してリソース不足の問題を解決している場合は、HTML ソース コードで相対 URL を使用しないことについて上記を参照してください。