Apache-2.2
用於 Web 應用程序的與目錄無關的 Apache mod_rewrite 規則
我正在開發一個 PHP 應用程序,但我對 mod_rewrite 的工作知識有限,我打算用它來創建“漂亮的 URL”。
雖然應用程序正在開發中,但我正在我的
public_html
文件夾中處理它。目前,我有一個index.php
提供對其他 PHP 文件的訪問權限,例如customers.php
它需要一個 ID 並在數據庫中查找該客戶的詳細資訊並顯示它們。未經美化的 URL 看起來像
http://server.domain.com/~user/webapp/customers.php?ID=1
我想要轉換為http://server.domain.com/~user/webapp/customers/1
.我已經編寫了以下 mod_rewrite 規則,用於
webapp/customers.php
重寫webapp/customers/
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /~user/webapp/ rewriterule ^customers$ customers.php [L] </IfModule>
這有一個明顯的缺點(我會擔心稍後在 URI 中提供 ID)。這被放置在 .htaccess 中,並假定應用程序位於
/home/user/webapp/
伺服器上。這顯然是限制性的並且非常不靈活,所以我想知道是否有一種方法可以創建與目錄無關的 mod_rewrite 規則,這樣應用程序的安裝位置就無關緊要了?我意識到它可能永遠不會完美,因為它取決於伺服器配置,但必須有比上述更好的方法來做我想做的事情?
對於您正在談論的案例,沒有顯式
RewriteBase
(並且只是讓它使用目前目錄上下文,預設情況下)應該可以正常工作。至於 ID 轉換,應遵循以下原則:
RewriteRule ^customers/(\d+)$ customers.php?ID=$1 [L]
試試這個:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule /~user/webapp/customers/([0-9]+)$ /~user/webapp/customers.php?ID=$1 [QSA,L] </IfModule>
這應該工作!
(PS:我盡量避免使用 RewriteBase,因為(相信我的經驗)如果你有很多規則並且在幾個月後編輯它們(= 你不記得有 RewriteBase),你可能會遇到麻煩)