Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php htacces更改多变量url_Php_.htaccess_Mod Rewrite_Get - Fatal编程技术网

Php htacces更改多变量url

Php htacces更改多变量url,php,.htaccess,mod-rewrite,get,Php,.htaccess,Mod Rewrite,Get,我有一个php页面,有一个或多个get变量,变量顺序可以根据不同的进程而不同 www.lorem.com/ipsum.php?var1=aaa&var2=bbb&var3=ccc www.lorem.com/ipsum.php?var2=bbb&var3=ccc www.lorem.com/ipsum.php?var2=bbb&var3=ccc&var1=aaa 我想重写url的所有类型的过程的一部分 www.lorem.com/ipsum/v1_aaa

我有一个php页面,有一个或多个get变量,变量顺序可以根据不同的进程而不同

www.lorem.com/ipsum.php?var1=aaa&var2=bbb&var3=ccc
www.lorem.com/ipsum.php?var2=bbb&var3=ccc
www.lorem.com/ipsum.php?var2=bbb&var3=ccc&var1=aaa
我想重写url的所有类型的过程的一部分

www.lorem.com/ipsum/v1_aaa-v2_bbb-v3_ccc
www.lorem.com/ipsum/v2_bbb-v3_ccc
www.lorem.com/ipsum/v2_bbb-v3_ccc-v1_aaa
如何编写将var1=aaa部分更改为v1_aaa的重写规则 和&to-也是ipsum.php?至同侧/


我想学习如何写作。

你想做的并不简单。您试图做的事情可以分为两部分:

  • 从页面中删除
    .php
    扩展名
  • 将查询字符串转换为成对的
    键值。我使用
    -
    字符作为分隔符
  • 在将url重写为seo友好的url时,您始终需要记住,您需要能够在内部将其重写回原始url,否则无法显示任何页面

    在.htaccess中应该包含什么内容

    您需要按照下面的
    .htaccess
    执行一些操作。我将尝试在代码下面解释其中的一些内容

    #External redirect
    RewriteCond %{THE_REQUEST} \.php
    RewriteRule ^(.*)\.php$ $1 [E=redirflag:1]
    
    RewriteCond %{ENV:redirflag} =1
    RewriteCond %{QUERY_STRING} ^([^=]+)=([^&]+)(&(.*)|)$
    RewriteRule ^(.*)/(ipsum|otherpage|test)(/.*)?$ $1/$2$3/%1-%2?%4 [E=redirflag:1,N]
    
    RewriteCond %{ENV:redirflag} =1
    RewriteRule ^(.*)$ /$1 [R,L,E=!redirflag]
    
    #Internal rewrite
    RewriteRule ^(.*)/([^-]+)-(.+)/?$ $1?$2=$3 [QSA,N,DPI]
    
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule ^(.*)$ /$1.php [L]
    
    仔细查看外部重定向

    让我们仔细看看会发生什么。第一条规则是从url中删除
    .php
    扩展名。我们使用
    %{THE_REQUEST}
    来确保外部请求中有
    .php
    的地方。如果我们不这样做,我们将创建一个无限循环。因为我们想在重定向之前进行一些其他重写,所以我设置了一个环境变量()<代码>$1
    被同一行上的第一个捕获组替换

    第二条规则是将所有键值对重写为添加到url中的
    /key-value/
    。它只适用于包含
    ipsum
    otherpage
    test
    的URL(不一定以其结尾)。第一个条件是检查我在第一条规则中设置的标志是否为
    1
    。这意味着如果第一条规则不匹配,我也不匹配这条规则。注意,我使用了
    =1
    ,它检查变量是否等于字符串
    1
    ,并且不将is视为正则表达式。(). 第二个条件中的正则表达式与捕获组1中的键、捕获组2中的值匹配,如果后面有更多键和值,则与捕获组4中的键和值匹配<代码>%1和实际规则中的类似变量将被上次重写条件中的相应捕获组替换。
    N
    标志将从一开始就继续重新启动
    .htaccess
    ,直到此规则不再匹配为止

    第三条规则将客户端重定向到我们刚刚重写的url<代码>R是一个临时重定向。当您对所有URL都满意时,将其设置为
    R=301
    ,使其成为永久重定向<代码>E=!redirflag将删除该环境变量

    仔细查看内部重写

    客户端使用seo友好的url向服务器发出新请求。我们需要在内部将其重写回对服务器实际有用的url。在url的末尾,我们有(或可能有)键值对,所以让我们先将它们重写回查询字符串中的键值对。
    QSA
    标志将当前查询字符串附加到我们已有的查询字符串。我们已经看到了
    N
    标志。
    DPI
    标志是“放弃路径信息”,用于防止重复路径追加到url末尾,从而导致无限循环。如果忽略这一点,您的服务器将被锁定,错误日志将非常庞大,我相信Apache最终将崩溃

    只有当第一条规则不再匹配时,第二条规则才会匹配。url末尾没有更多的键值对,因此我们在一开始就删除了php扩展。让我们再附加一次。此规则的条件是uri尚未以
    .php
    结尾。如果这个条件不存在,它会不断追加
    .php
    ,最终会出现类似
    test.php.php.php.php.php.php
    (我们不希望这样)

    进一步阅读

    首先,阅读
    mod_rewrite
    。它非常详细,如果您不理解与之相关的代码中的某些内容,那么它是一个很好的参考指南


    mod_rewrite
    使用类似perl的正则表达式语法。如果您无法理解某个正则表达式的含义,请在它旁边放一个PREG/PCRE语法表。当你试图理解或写一些东西时,这会有很大帮助。一个在线preg-regex工具可以非常有助于查看某个表达式的匹配和不匹配之处。请记住,在应该逃避和不应该逃避的问题上可能存在差异。

    您试图做的事情并不简单。您试图做的事情可以分为两部分:

  • 从页面中删除
    .php
    扩展名
  • 将查询字符串转换为成对的
    键值。我使用
    -
    字符作为分隔符
  • 在将url重写为seo友好的url时,您始终需要记住,您需要能够在内部将其重写回原始url,否则无法显示任何页面

    在.htaccess中应该包含什么内容

    您需要按照下面的
    .htaccess
    执行一些操作。我将尝试在代码下面解释其中的一些内容

    #External redirect
    RewriteCond %{THE_REQUEST} \.php
    RewriteRule ^(.*)\.php$ $1 [E=redirflag:1]
    
    RewriteCond %{ENV:redirflag} =1
    RewriteCond %{QUERY_STRING} ^([^=]+)=([^&]+)(&(.*)|)$
    RewriteRule ^(.*)/(ipsum|otherpage|test)(/.*)?$ $1/$2$3/%1-%2?%4 [E=redirflag:1,N]
    
    RewriteCond %{ENV:redirflag} =1
    RewriteRule ^(.*)$ /$1 [R,L,E=!redirflag]
    
    #Internal rewrite
    RewriteRule ^(.*)/([^-]+)-(.+)/?$ $1?$2=$3 [QSA,N,DPI]
    
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule ^(.*)$ /$1.php [L]
    
    仔细查看外部重定向

    让我们仔细看看会发生什么。第一条规则是从url中删除
    .php
    扩展名。我们使用
    %{THE_REQUEST}
    来确保外部请求中有
    .php
    的地方。如果我们不这样做,我们将创建一个无限循环。因为我们想在重定向之前进行一些其他重写,所以我设置了一个环境变量()<代码>$1
    被同一lin上的第一个捕获组替换