适用于 Web 应用程序的目录无关的 Apache mod_rewrite 规则

适用于 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 规则这样应用程序的安装位置就无关紧要了?我意识到它可能永远不会完美,因为它取决于服务器配置,但一定有比上述方法更好的方法来实现我想要的效果?

答案1

对于您所谈论的用例,没有明确的RewriteBase(而只是让它使用当前目录上下文,这是默认的)应该可以正常工作。

至于 ID 转换,应该按照以下思路进行:

RewriteRule ^customers/(\d+)$ customers.php?ID=$1 [L]

答案2

尝试这个:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule /~user/webapp/customers/([0-9]+)$ /~user/webapp/customers.php?ID=$1 [QSA,L]
</IfModule>

这应该可行!

(PS:我尝试避免使用 RewriteBase,因为(相信我的经验)如果你有很多规则并且在几个月后编辑它们(=你不记得有一个 RewriteBase),你可能会遇到麻烦。)

答案3

经过一番研究,我终于找到了自己的答案。安装 Web 应用程序时,它会要求输入 Web 地址和应用程序的本地文件路径,并在 .htaccess 中将其用作 RewriteBase。

相关内容