我正在开发一个 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。