htaccess 重寫規則在遷移到 php 8 後不起作用
P粉274161593
2023-09-01 15:19:38
<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>
這與 PHP 版本無關 - 你的規則顯然衝突...
因為第一條規則中的正規表示式太籠統(它符合
/s/foo/
),如果您簡單地新增第二條規則,那麼第一條規則仍然會捕獲所有請求並重寫為search.php?feq=foo&key=
而不管路徑段的數量。您需要更具體地使用正規表示式。例如,僅匹配整個路徑段,而不是字面上的任何:請注意
(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 路徑。例如:
然後透過內部子請求提供/baba/404.php
,並且錯誤文件本身不會暴露給最終使用者。如果您使用「重定向」來解決缺少資源的問題,請參閱上述關於不在 HTML 原始碼中使用相對 URL 的內容。