Php htacces更改多变量url
我有一个php页面,有一个或多个get变量,变量顺序可以根据不同的进程而不同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
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
扩展名键值。我使用-
字符作为分隔符
.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
扩展名键值。我使用-
字符作为分隔符
.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上的第一个捕获组替换