Mod_rewrite 消除查询字符串

Mod_rewrite 消除查询字符串

我已经研究这个问题一段时间了,但我没有找到我真正想要的东西。我正在编写一个 webapp,让我的用户在他们选择的域和 URL 文件夹结构中创建和发布 HTML 内容。所有内容和请求的 URL 结构都存储在数据库中。我在我的 index.php(在根文件夹中)中拥有所有代码来访问数据库内容,并根据服务器名称(希望还有文件夹结构)从数据库中挑选出适当的内容并将其显示给最终用户的浏览器。所以我的情况是这样的:

www.test.com/index.php?id=123234345

... 将显示正确的页面,但我希望我的用户能够定义一个唯一的“页面名称”,而不是使用数字索引(我也想隐藏/index.php 部分),所以我希望最终用户看到的是:

www.test.com/arbitrary-unique-keyword/keyword2/keyword3

这将调用根文件夹中的 index.php 页面。然后我将使用 PHP $_SERVER['PATH_INFO'] 变量将请求的文件夹结构与数据库中的正确内容进行匹配并显示。到目前为止,我发现的所有材料都要求我将文件夹结构的各部分硬编码到规则中……但我想我想要更简单的东西(也许)。

简而言之,问题是:

如何使用 mod_rewrite 允许所有“不存在”的文件夹路径传递到位于根文件夹中的主 index.php?(对于所有存在的路径,例如对图像的调用……我希望它们能够成功,并且显然不会被定向到 index.php)

谢谢大家,如果我能澄清任何事情,请告诉我。

答案1

您可以RewriteCond使用-f测试文件是否存在的条件来实现这一点,例如:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php/$1

但是,如果有多个重写条件或Alias/ScriptAlias指令,情况可能会更复杂。在这种情况下,服务器可能无法提供REQUEST_FILENAME。一种更安全的方法,但对于复杂的设置来说可能不正确,是直接使用DOCUMENT_ROOT,即

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
RewriteRule ^(.*)$ /index.php/$1

相关内容