搜尋

首頁  >  問答  >  主體

htaccess 重寫規則在遷移到 php 8 後不起作用

<p>從 PHP 7 遷移到 PHP 8 後,我遇到了 url 重寫規則的問題。 </p> <p>在 htaccess 之上,我有以下程式碼</p> <pre class="brush:php;toolbar:false;">Options FollowSymLinks RewriteEngine on RewriteBase /baba/ ErrorDocument 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]</pre> <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]</pre></p>
P粉274161593P粉274161593458 天前572

全部回覆(1)我來回復

  • P粉022501495

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

    這與 PHP 版本無關 - 你的規則顯然衝突...

    因為第一條規則中的正規表示式太籠統(它符合/s/foo/),如果您簡單地新增第二條規則,那麼第一條規則仍然會捕獲所有請求並重寫為search.php?feq=foo&key= 而不管路徑段的數量。您需要更具體地使用正規表示式。例如,僅匹配整個路徑段,而不是字面上的任何

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

    回覆
    0
  • 取消回覆