Apache-2.2

用於 Web 應用程序的與目錄無關的 Apache mod_rewrite 規則

  • December 7, 2011

我正在開發一個 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),你可能會遇到麻煩)

引用自:https://serverfault.com/questions/330416