【问题标题】:.htaccess pretty url uknown ammount of variables.htaccess 漂亮的 url 未知数量的变量
【发布时间】:2018-10-07 22:13:33
【问题描述】:

我很难找到我正在搜索的内容的具体答案。 我主要做的是制作漂亮的网址。在大多数情况下,当我知道 url 必须包含的变量数量时,我能够使其工作,例如:

原网址:

index.php?lang=en&show=contact-us

htaccess:

RewriteRule ^([a-z]+)/([a-z-]+)$ index.php?lang=$1&show=$2 [NC,L]

新网址:

/en/contact-us

对于“已知数量的变量”,我有多个作为这个,我将向您展示另一个示例:

原网址:

index.php?lang=en&show=for-rent-details&object=8500479

htacces:

RewriteRule ^([a-z]+)/for-rent/([0-9]+)/([0-9a-z-]+)$ index.php?lang=$1&show=for-rent-details&id=$2&name=$3 [NC]

新网址:

/en/for-rent/8500479/rocha-tower-14e

但现在的问题是用户何时进行搜索。这意味着 url 将根据客户将选择的项目数量组成。默认情况下有 5 个变量:

原网址:

index.php?lang=en&show=filter&beachDistance=500&roomQty=2&sortRent=asc

htaccess:

RewriteRule ^([a-z]+)/([a-z-]+)/([0-9]+)/([0-9]+)/([a-z]+)$ index.php?lang=$1&show=$2&beachDistance=$3&roomQty=$4&sortRent=$5 [NC]

新网址:

/en/filter/500/2/asc

这是搜索功能的“默认”网址格式。如果用户未选择任何内容,则这些是默认变量和发送的相应值。但是如果用户想要选择一些额外的信息(城市或兴趣点),那么它们会出现在这样的后面:

工作网址:

index.php?lang=en&show=filter&poi-1=1&poi-3=3&beachDistance=500&roomQty=2&sortRent=asc

我希望它是:

/en/filter/1/3/500/2/asc

而另一个搜索可能有:

/en/filter/1/3/44/13/90/500/2/asc

也许还有一个带有以下变量的:

/en/filter/1/3/9/2/500/2/asc

所以这就是我所说的未知“变量数量”的意思,htaccess 不会确切知道数量,但无论如何我希望它仍然重写 url。我已经阅读了有关 QSA 标志规则的信息,但我有点不确定如何实施它。

【问题讨论】:

    标签: php .htaccess url-rewriting


    【解决方案1】:

    如果它不知道变量的数量,它就无法知道将什么值传递给什么变量。您可以使用外部程序探索 RewriteMap 以处理 php 脚本中的重写,但此时您可以直接在控制器中执行此操作。

    您可以做的是“修饰”您的网址的一部分并传递剩余的查询参数,因为您提出的结果网址不太友好并且组合太多,为此您可以使用QSA as你提到。这就是标志的作用,将原始查询字符串传递给新的 url。

    使用以下规则:

    RewriteRule ^([a-z]+)/([a-z-]+)$ index.php?lang=$1&show=$2 [QSA]
    

    给定请求/en/filter/?poi-1=1&poi-3=3&beachDistance=500&roomQty=2&sortRent=asc,您将获得重写后的网址index.php?lang=en&show=filter&poi-1=1&poi-3=3&beachDistance=500&roomQty=2&sortRent=asc

    如果你没有设置标志 apache 将丢弃查询字符串,因为重写的 url 已经有一个。您可以检查QS* 标志here 的行为。

    此规则将与您当前的双参数规则冲突,因此您可以删除现有规则或将新规则移至开头并使其更具体,使其仅适用于搜索页面:

    RewriteRule ^([a-z]+)/(filter)$ index.php?lang=$1&show=$2 [QSA,L]
    

    【讨论】:

    • 但这对我之前的任何规则意味着什么?
    • 将上面写的重写规则移到开头?
    • 是的,我在您更新答案之前解决了它。尽管如此,你已经帮助我解决了这个问题并且它正在工作。如果你有可能,你能解释一下为什么这个网址不是很友好吗?在搜索引擎优化等的情况下。
    • @calexandru 它们只是一堆数字,没有任何迹象表明它们是什么。您的其他示例确实有意义。
    猜你喜欢
    • 1970-01-01
    • 2021-07-01
    • 2021-10-14
    • 2013-02-16
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    相关资源
    最近更新 更多