当前位置: 首页 > 知识库问答 >
问题:

用于多个和长查询的友好URL

封鸿雪
2023-03-14

我试过几个不同的问题:

  1. php-.htaccess使URL对多个动态参数更友好

上面的问题没有用,所以我开始开发一个替代方案,但我的代码在多个请求(代码1)和一个请求(代码2)中返回404错误,因此:

(code1)-不工作-多重恢复(code2)-工作正常-单请求

代码1


    Options +FollowSymLinks -MultiViews
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /~loja/index.php?a=$1&genero=$2&material=$3&cor=$4&tamanho=$5&Ordenacao=$6 [NC,L,QSA]
    RewriteCond %{THE_REQUEST} ^.*/index\.php 
    RewriteRule ^(.*)index.php$ /~loja/$1/$2/$3/$4/$5/$6 [R=301,L]  
    DirectoryIndex index.php

现在查看正确的代码:

代码2


    Options +FollowSymLinks -MultiViews
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([a-zA-Z0-9_-]+)$ /~loja/index.php?a=$1 [NC,L,QSA]
    RewriteCond %{THE_REQUEST} ^.*/index\.php 
    RewriteRule ^(.*)index.php$ /~loja/$1 [R=301,L]  
    DirectoryIndex index.php

(代码1)有什么问题?

共有1个答案

牛昱
2023-03-14

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

所以,应该是:

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

您可以通过在段/字符的末尾附加字符,使其成为可选的。

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

请求包含浏览器发送到服务器的完整HTTP请求行(例如,GET/index.html HTTP/1.1)。这不包括浏览器发送的任何附加标题。与下面大多数其他变量不同,此值未被取消扫描(解码)。

如果不想使用它,请改用REQUEST\u URI

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

您的原始规则集需要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/路径的此规则,您可以如下更新上述RewriteCond

RewriteCond %{REQUEST_URI} !(index\.php|admin)
 类似资料:
  • 我正在努力使我的网站更加SEO友好,我目前正在使用 将转换为 我还想将其用于子页面。我试过这个: 但是它不工作,它运行,但是当您转到时,它返回未找到的404。 我希望它运行并返回 或 site.co.uk/page_name/sub_page并返回sub_page 等等等等

  • 问题内容: 我正在尝试从用户表中提取数据,并且需要“朋友之友”,这些人与所选用户相距两步 但未直接连接到所选用户 我尝试了以下查询: 我不知道如何拉未直接连接到所选用户的用户。我得到了当前用户的朋友的所有朋友,但是我 也 得到了当前用户的直接朋友。 问题答案: 您只需要排除既是直接朋友又是朋友的人。我已经重新排列了表别名,这样(无论如何对我来说)就更清楚了要检索的内容: 它还消除了排除要查询的用户

  • 可能重复: 在php中使用seo用户友好 在代码注入器中自定义路由 我正在设计一个CMS,我想使用用户友好的URL而不是查询字符串。 例如。:

  • 问题内容: JOIN查询比几个查询快吗?(您运行主查询,然后根据主查询的结果运行许多其他的SELECT) 我问是因为加入它们会使我的应用程序设计复杂化 如果速度更快,谁能大致估算出多少?如果是1.5倍,我不在乎,但是如果是10倍,我想我是。 问题答案: 这太模糊了,无法为您提供与您的具体情况相关的答案。这取决于很多事情。Jeff Atwood(该网站的创始人)实际上撰写了有关此内容的文章。但是,在

  • 问题内容: 我正在尝试编写一个mysql查询,它将使用产生以下输出的类别表为pages表中的所有页面生成URL。 预期的输出量: 这是我尝试生成最多4个段的URL的MySql查询: 链接到 SQL Fiddle 问题答案: 这是我自己的问题的答案: 我尝试使用“ MySql Modified preorder tree to create url ”方法,该方法在查询优化和通过stackoverf

  • 问题内容: 从PHP 5.3版开始,已对驱动程序进行了补充。它引入了对多个查询的支持。 但是,如果传递了多个查询,我无法弄清楚如何获得两个结果集。这两个查询都已执行,不可能是第二个查询刚刚被转储。 返回值: 问题答案: 原来,您需要使用。 这将返回第二个查询的结果。 这是一个有点奇怪的实现。如果多查询语句仅将两个结果集返回在一个数组下,那肯定会更容易。但是,优点是此实现允许使用不同的FETCH样式