首页  >  问答  >  正文

使用 .htaccess 通过查询字符串将文件路径重写为文件名

我在使用查询字符串重写文件路径时遇到问题

我正在尝试获取如下所示的网址:

https://url.com/products/1_Samsung_Galaxy

并像这样重写对我的服务器的请求:

https:url.com/model.php?id=1&title=Samsung_Galaxy

这是我的 htaccess 到目前为止的样子:

RewriteEngine On

#rewrite no ending files to .php if file doesn't exist
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !products/
RewriteRule ^([^.]+)$ .php [NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/products/([1-9]+)(.*)$ model.php?id=&title= [NC,L]

使用当前配置,请求将发送到与 model.php 位于同一目录中的名为 products.php 的文件,但似乎位于不同的目录中,因为具有相对路径的 products.php 中引用的一些脚本文件会抛出异常它们包含的对象不存在的错误。

实际上,我的主要问题是我不知道 apache 语法或它是如何工作的,而且我很难找到可以了解 apache 的资源。由于某种原因,apache 文档没有太大帮助。如果有学习如何编写 apache 文件的好资源,我也很乐意查看。

P粉035600555P粉035600555315 天前540

全部回复(1)我来回复

  • P粉463824410

    P粉4638244102024-01-02 10:59:01

    您的问题有点模糊,但我认为这就是您正在寻找的:

    RewriteEngine On
    
    # rewrite /products/ to /model.php/.....
    RewriteRule ^/?products/(\d+)(.*)$ /model.php?id=&title= [L]
    
    # rewrite to "...php" if such file exists
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^ %{REQUEST_URI}.php [L]

    如果在 http 服务器的主机配置中实施,这些规则将起作用。或者,如果您无权访问该文件,则可以在位于 http 主机的 DOCUMENT_ROOT 文件夹中的分布式配置文件(“.htaccess”)中进行访问。

    与您的尝试的主要区别:

    • 目标路径被写为绝对路径。这解决了请求被重写到不同文件夹的问题。
    • 首先实现对 /model.php 的异常重写,因此在文件的较高位置执行,因为规则是从上到下处理的。这节省了一些条件。

    您还提到您“不熟悉 apache 语法”并且很难找到资源来学习它。

    我总是推荐 apache 模块的官方文档。它们品质卓越,并提供了很好的示例:

    https://httpd.apache.org/docs/current/mod /mod_rewrite.html

    回复
    0
  • 取消回复