多个和长查询的友好URL

时间:2017-01-09 13:40:01

标签: apache .htaccess redirect mod-rewrite

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

  1. php - .htaccess make URL user friendly for multiple and dynamic parameters
  2. .htaccess for friendly URL with multiple variables
  3. User-friendly URLs instead of Query Strings?
  4. 上面的问题没有用,所以我开始开发一个替代方案,但是我的代码在多个请求中返回404错误( code1 ),并且一个请求运行良好( code2 )所以:

    code1 ) - 不要工作 - 多次Resquest ( 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
    
    

    code1 )有什么问题?

1 个答案:

答案 0 :(得分:2)

第一个规则集无效,因为目标网址包含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)