suchen

Heim  >  Fragen und Antworten  >  Hauptteil

htaccess-Rewrite-Regeln funktionieren nach der Migration auf PHP 8 nicht

<p>Nach der Migration von PHP 7 auf PHP 8 stieß ich auf ein Problem mit den Regeln zum Umschreiben von URLs. </p> <p>Zusätzlich zu htaccess habe ich den folgenden Code</p> <pre class="brush:php;toolbar:false;">Optionen +FollowSymLinks RewriteEngine aktiviert RewriteBase /baba/ Fehlerdokument 404 http://localhost/baba/404.php</pre> <ol> <li>Suchseite:-</li> </ol> <p>Es funktioniert großartig, wenn ich einfach die folgende Regel verwende: -</p> <pre class="brush:php;toolbar:false;">RewriteRule ^s/([w-]+)/(.*)$ search.php?feq=$1&key=$2 [QSA,L ]</pre> <p>Aber wenn ich weitere Regeln wie unten hinzufüge, ergeben diese Seiten 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]</pre> <ol start="2"> <li>Zielseite:-</li> </ol> <p>Es funktioniert großartig, wenn ich einfach die folgende Regel verwende: -</p> <pre class="brush:php;toolbar:false;">RewriteRule ^([w-]+)$ land.php?name=$1 [QSA,L]</pre> <p>Aber wenn ich weitere Regeln wie unten hinzufüge, werden das CSS und die Bilder auf anderen Seiten nicht mehr geladen und diese Seiten geben 404 aus. </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]</pre></p>
P粉274161593P粉274161593458 Tage vor570

Antworte allen(1)Ich werde antworten

  • P粉022501495

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

    这与 PHP 版本无关 - 你的规则显然冲突......

    因为第一条规则中的正则表达式太笼统(它匹配 /s/foo/),如果您简单地添加第二条规则,那么第一条规则仍然会捕获所有请求并重写为 search.php?feq=foo&key= 而不管路径段的数量。您需要更具体地使用正则表达式。例如,仅匹配整个路径段,而不是字面上的任何

    RewriteRule ^s/([\w-]+)/([^/]*)$ search.php?feq=$1&key=$2 [QSA,L]
    
    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]

    请注意 [^/](除 / 之外的任何内容)而不是 .(任何内容)。还可以在强制路径段中使用 +(1 个或多个)。

    与您的原始规则一样,key URL 参数(即第一个规则中的第二个路径段和后续规则中的最后一个路径段)是可选。这是故意的吗?

    如果您知道这些 URL 参数中允许使用的字符,则应在正则表达式中指出这些字符,以进一步限制 URL,否则会被(错误地)重写。

    您也可以颠倒指令的顺序来解决眼前的问题,但这只是部分解决方案,因为您的正则表达式仍然太通用。

    如上所述。但 CSS 和图像失败可能是由于在客户端 HTML 中使用这些资源的相对 URL 路径造成的。您正在从不同的路径深度重写请求,因此您必须使用静态资源的根相对(或绝对)URL。相对 URL 自然会(由浏览器)相对于浏览器地址栏中的 URL 进行解析。

    (作为一种解决方法,您可以在 head 部分中设置 base 元素,以指示所有相对 URL 都是相对的基本 URL 路径相对 到,但这并非没有警告。)

    有关丢失资产的进一步阅读:

    另请注意,您的“着陆页”规则必须位于“搜索页”规则之后,否则它们也会发生冲突。同样,可以通过使正则表达式更加具体来避免这种冲突。例如,通过将“着陆页”中的第一个路径段(name URL 参数的值)设置为 2 个或更多字符,而不是 1 个或更多字符,以避免与 / 冲突s/(在“搜索”中)。


    旁白:

    这会触发 302(临时)重定向到您的 404 错误文档(它掩盖了 404 响应和实际触发 404 的 URL)。这通常是不可取的,除非您有非常具体的要求。您通常应该在此处使用根相对 URL 路径。例如:

    ErrorDocument 404 /baba/404.php
    然后通过内部子请求提供

    /baba/404.php,并且错误文档本身不会暴露给最终用户。

    如果您使用“重定向”来解决缺少资源的问题,请参阅上述关于不在 HTML 源代码中使用相对 URL 的内容。

    Antwort
    0
  • StornierenAntwort