多个和长查询的友好 URL

Posted

技术标签:

【中文标题】多个和长查询的友好 URL【英文标题】:Friendly URL for multiple and long queries 【发布时间】:2017-05-23 19:03:15 【问题描述】:

我尝试了几个不同的问题:

    php - .htaccess make URL user friendly for multiple and dynamic parameters .htaccess for friendly URL with multiple variables User-friendly URLs instead of Query Strings?

上面的问题没有用,所以我开始开发一个替代方案,但是我的代码在多个请求时返回 404 错误(code1),并且一个请求运行良好( code2) 所以:

(code1) - 不工作 - 多个请求 (code2) - 工作正常 - 单个请求

代码1

选项 +FollowSymLinks -MultiViews 重写引擎开启 RewriteCond %REQUEST_FILENAME !-f RewriteCond %REQUEST_FILENAME !-d 重写规则 ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /~loja/index.php?a=$1&genero=$2&material=$3&cor=$4&tamanho=$5&Ordenacao=$6 [NC,L,QSA] RewriteCond %THE_REQUEST ^.*/index\.php 重写规则 ^(.*)index.php$ /~loja/$1/$2/$3/$4/$5/$6 [R=301,L] DirectoryIndex index.php

现在查看正确的代码:

代码2

选项 +FollowSymLinks -MultiViews 重写引擎开启 RewriteCond %REQUEST_FILENAME !-f RewriteCond %REQUEST_FILENAME !-d 重写规则 ^([a-zA-Z0-9_-]+)$ /~loja/index.php?a=$1 [NC,L,QSA] RewriteCond %THE_REQUEST ^.*/index\.php 重写规则 ^(.*)index.php$ /~loja/$1 [R=301,L] DirectoryIndex index.php

(code1) 有什么问题?

【问题讨论】:

@anubhava 如果你能帮助我:) 您要重写的 URL 是什么?请提供一些示例,包括失败的示例。 原始网址:site.com/index.php?a=botas-infantil&genero=feminino&material=couro&cor=marrom&tamanho=24-25&Ordenacao=MenorPreco 目标:site.com/botas-infantil/feminino/couro/marrom/tamanho/24-25/MenorPreco 代码 2 工作完美,但添加更多请求调用错误 404 【参考方案1】:

第一个规则集不起作用,因为 goal URL 包含 7 个片段,但 RewriteRule 匹配 6 个片段。如果您在RewriteRule 中的$ 之前添加另一个/([^/]*),它将起作用。

所以,应该是:

RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /~loja/index.php?a=$1&genero=$2&material=$3&cor=$4&tamanho=$5&Ordenacao=$6 [NC,L,QSA]

您可以通过在末尾附加? 字符来使段/字符可选。

第一个规则集的第二部分是完全错误的,没有任何用处。首先,您应该注意 THE_REQUEST 变量包含完整的 HTTP 请求行,如 documentation states:

THE_REQUEST 包含浏览器发送到服务器的完整 HTTP 请求行(例如,GET /index.html HTTP/1.1)。这不包括浏览器发送的任何附加标头。与下面的大多数其他变量不同,该值没有被转义(解码)。

您不想使用它,请改用REQUEST_URI

404

您收到 404 错误的原因是因为 RewriteRule 无法匹配请求 URI,因此 URL 不会被重写为 index.php。文件系统上不存在该目录层次结构,因此 404.

可选的 URI 段

您的原始规则集期望 URI 参数的准确计数。如果您需要对此更加灵活,您可以试试这个接受 1-7 段并将它们映射到查询字符串的规则集:

<IfModule mod_rewrite.c>
    RewriteEngine on

    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d

    RewriteCond %REQUEST_URI !index\.php
    RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)$ /~loja/index.php?a=$1&genero=$2&material=$3&cor=$4&tamanho=$5&Ordenacao=$6 [NC,L,QSA]
</IfModule>

当您对此进行测试时,请注意空查询字符串。在 PHP 方面,您需要使用empty() 而不是isset(),以查看查询字符串是否存在。因为它们总是设置的,但是是空的。

不包括admin/

为了排除此规则应用于admin/ 路径,您可以像这样更新上面的RewriteCond

RewriteCond %REQUEST_URI !(index\.php|admin)

【讨论】:

我尝试使用 THE_REQUEST Begin working :D with REQUEST_URI make error。现在我将 root 我的档案 url (js, css) 我想知道是否存在一种处理 1 个请求的方法?还是2?我尝试了 7 个请求,效果很好! srv98.prodns.com.br/~loja/botas-infantil/feminino/couro/marrom/… 是的,它也可以使用更少的 URI 段。将尽快更新答案。 我尝试对 ~loja/admin/* 的任何冲突进行任何修改 #RewriteRule ^admin$ - [PT] RewriteRule ^admin/.$ - [PT] #RewriteCond %REQUEST_URI !/admin 我想说你的代码是不可重复的。完美的!我一个人做不到。它工作得很好。我只需要感谢你丰富的知识。感谢像你这样的人,世界变得越来越好。非常感谢!!!

以上是关于多个和长查询的友好 URL的主要内容,如果未能解决你的问题,请参考以下文章

301 通过 .htaccess 将查询字符串重定向到 SEO 友好的 URL

Laravel:将输入查询的结果更改为友好URL

如何通过php查询使URL友好SEO [重复]

C# Byte[] 到 URL 友好字符串

如何制作seo友好的AMP页面查询字符串

带有可选参数的 Liferay 友好 URL