les règles de réécriture htaccess ne fonctionnent pas après la migration vers php 8
P粉274161593
2023-09-01 15:19:38
<p>Après la migration de PHP 7 vers PHP 8, j'ai rencontré un problème avec les règles de réécriture d'URL. </p>
<p>En plus de htaccess, j'ai le code suivant</p>
<pre class="brush:php;toolbar:false;">Options +FollowSymLinks
Réécrire le moteur activé
RéécrireBase /baba/
Document d'erreur 404 http://localhost/baba/404.php</pre>
<ol>
<li>Page de recherche :-</li>
</ol>
<p>Cela fonctionne très bien si j'utilise simplement la règle suivante : -</p>
<pre class="brush:php;toolbar:false;">RewriteRule ^s/([w-]+)/(.*)$ search.php?feq=$1&key=$2 [QSA,L ]≪/pré>
<p>Mais si j'ajoute plus de règles comme ci-dessous, ces pages donneront 404. </p>
<pre class="brush:php;toolbar:false;">RewriteRule ^s/([w-]+)/(.*)/(.*)$ search.php?feq=$1&city= $2&clé=$3 [QSA,L]
RewriteRule ^s/([w-]+)/(.*)/(.*)/(.*)$ search.php?feq=$1&pro=$2&city=$3&key=$4 [ QSA,L]</pré>
<ol start="2">
<li>Page de destination :-</li>
</ol>
<p>Cela fonctionne très bien si j'utilise simplement la règle suivante : -</p>
<pre class="brush:php;toolbar:false;">RewriteRule ^([w-]+)$ land.php?name=$1 [QSA,L]</pre>
<p>Mais si j'ajoute plus de règles comme ci-dessous, les CSS et les images cessent de se charger sur d'autres pages et ces pages donnent 404. </p>
<pre class="brush:php;toolbar:false;">RewriteRule ^([w-]+)/(.*)/(.*)$ land.php?name=$1&pro=$2& ;ville=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]≪/pre>≪/p>
Cela n'a rien à voir avec la version PHP - vos règles sont clairement contradictoires...
Parce que l'expression régulière dans la première règle est trop générale (elle correspond à
/s/foo/
),如果您简单地添加第二条规则,那么第一条规则仍然会捕获所有请求并重写为search.php?feq=foo&key=
quel que soit le nombre de segments de chemin). Vous devez être plus précis avec l'expression régulière. Par exemple, faites correspondre uniquement le segment de chemin entier, pas littéralement n'importe lequel :Veuillez noter
[^/]
(除/
之外的任何内容)而不是.
(任何内容)。还可以在强制路径段中使用+
(1 ou plus).Comme pour votre règle d'origine, les
key
paramètres d'URL (c'est-à-dire le deuxième segment de chemin dans la première règle et le dernier segment de chemin dans les règles suivantes) sont facultatifs. Est-ce intentionnel ?Si vous connaissez les caractères autorisés dans ces paramètres d'URL, vous devez indiquer ces caractères dans l'expression régulière pour restreindre davantage l'URL, sinon elle sera (incorrectement) réécrite.
Vous pouvez également inverser l'ordre des instructions pour résoudre le problème en question, mais ce n'est qu'une solution partielle puisque votre regex est encore trop générique.
Comme mentionné ci-dessus. Cependant, des échecs CSS et d'image peuvent être provoqués par l'utilisation de chemins d'URL relatifs pour ces ressources dans le HTML côté client. Vous réécrivez la demande à partir d’une profondeur de chemin différente, vous devez donc utiliser l’URL racine relative (ou absolue) de la ressource statique. Les URL relatives sont naturellement résolues (par le navigateur) par rapport à l'URL dans la barre d'adresse du navigateur.
(Pour contourner le problème, vous pouvez transmettre le chemin de l'URL de base
head
部分中设置base
relative dans l'élément pour indiquer que toutes les URL relatives sont relatives, mais ce n'est pas sans réserves.)Lectures complémentaires sur les biens perdus :
Notez également que votre règle « Landing Page » doit venir après votre règle « Search Page » sinon elles seront également en conflit. Encore une fois, ce conflit peut être évité en rendant l'expression régulière plus spécifique. Par exemple, en modifiant le premier segment de chemin dans "Landing Page" (
name
URL 参数的值)设置为 2 个或更多字符,而不是 1 个或更多字符,以避免与/ 冲突s/
(dans "Recherche").Narration :
Cela déclenche une redirection 302 (temporaire) vers votre document d'erreur 404 (qui masque la réponse 404 et l'URL qui a réellement déclenché le 404). Ceci n’est généralement pas conseillé, sauf si vous avez des exigences très spécifiques. Vous devez généralement utiliser ici un chemin d'URL relatif à la racine. Par exemple :
Le/baba/404.php
est ensuite servi via une sous-requête interne, et le document d'erreur lui-même n'est pas exposé à l'utilisateur final.Si vous utilisez des redirections pour résoudre les problèmes de ressources manquantes, voir ci-dessus pour ne pas utiliser d'URL relatives dans le code source HTML.