我想重寫以下 URL(以及其他一些 URL;并非所有檔案都在/app檔案夾中):
/app/12345/process/789 => /app/process.php?contract_id=12345&id=789
/app/12345/login => /app/login.php?contract_id=12345
/app/12345/settings => /app/settings.php?contract_id=12345
/app/12345/tags => /app/tags.php?contract_id=12345
/app/12345 => /app/start.php?contract_id=12345
/app/login => /app/login.php
到目前為止,在您對 stackoverflow 的大力幫助下:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/] )/process/([^/] )/?$ app/process.php?contract_id=$1&id=$2 [L,NC,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/] )/(login|settings|tags)/?$ verfahrensverzeichnis/$2.php?contract_id=$1 [L,NC,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/] )/?$ app/start.php?contract_id=$1 [L,NC,QSA]
我需要最后一次重定向的規則:
/app/login => /app/login.php
uj5u.com熱心網友回復:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^app/([^/] )/process/([^/] )/?$ app/process.php?contract_id=$1&id=$2 [L,NC,QSA] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^app/([^/] )/(login|settings|tags)/?$ verfahrensverzeichnis/$2.php?contract_id=$1 [L,NC,QSA] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^app/([^/] )/?$ app/start.php?contract_id=$1 [L,NC,QSA]
對您現有規則的一些評論:
所有檔案系統檢查似乎都是多余的。我無法想象這些請求中的任何一個都可能映射到物理檔案或目錄?可能
/app/12345是檔案系統上的物理目錄?檔案系統檢查相對昂貴,因此如果可能最好避免。至少它會導致不必要的代碼膨脹。“id”只是數字嗎?您的示例 URL 使用僅限數字的 id(第二個和可選的第四個路徑段),但您在規則中允許“任何內容”。你應該盡可能具體。這自然會避免與您堅持的規則發生沖突,即。
/app/login到/app/login.php.您的示例 URL 沒有尾部斜杠,但是,您允許在規則中使用可選的尾部斜杠。這是必要的嗎?這可能會產生重復的內容問題,因為您現在有兩個不同的 URL(一個帶有斜杠,一個沒有斜杠)映射到同一資源。如果這些 URL 上可能有斜杠,那么這應該通過規范重定向(對于 SEO)而不是內部重寫來解決。
您已經
NC在所有這些規則中使用了標志。傳入的 URL 真的是不同的情況嗎?同樣,這可能會導致重復內容問題,因為/app/12345/process/789和/APP/12345/PROCESS/789是兩個不同的 URL。verfahrensverzeichnis第二條規則是什么?
我需要最后一次重定向的規則:
/app/login => /app/login.php
這可以說是您所有重寫中最簡單的,但是,目前您的最后一條規則會與此請求沖突并最終將請求重寫為app/start.php?contract_id=login. 所以你要么需要把這條規則放在第一位,要么限制你的正則運算式,所以你只匹配我上面提到的數字 ID(首選),這自然會避免這種沖突。
因此,考慮到上述幾點,您的規則變為:
# Ensure that MultiViews is disabled (must be disabled for these rules to work)
Options -MultiViews
RewriteRule ^app/(\d )/process/(\d )$ app/process.php?contract_id=$1&id=$2 [QSA,L]
RewriteRule ^app/(\d )/(login|settings|tags)$ app/$2.php?contract_id=$1 [QSA,L]
RewriteRule ^app/(\d )$ app/start.php?contract_id=$1 [QSA,L]
RewriteRule ^app/login$ app/login.php [L]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/529521.html
標籤:.htaccess改写
上一篇:如果條件為假,如何不創建輸入?
