我有一个友好的网址如下:
www.dominio.com.br/cidade/sao-paulo
这是我的htaccess重写规则:
RewriteRule ^cidade/(.*)$ busca-cidade.php?cidade=$1
和SQL查询:
Select * from cidades where cidade = 'sao-paulo'
是否可以使用htaccess和rewrite规则用空格替换连字符?因此友好的URL将映射到:
www.dominio.com.br/busca-cidade.php?cidade=sao%20paulo
这完成了我的代码,很棒,会给予优化。
####################################TESTE
RewriteRule ^teste?$ busca-cidade.php?locacao_venda=L
#(1) http://www.imobiliariaemaximovel.com.br/teste
#GET TIPO IMOVEL
RewriteRule ^(teste/[^\-]*)[\-]+(.*)([^\-]*)([^\-]*)$ $1\ $2 [DPI]
RewriteCond %{REQUEST_URI} !\-
RewriteRule ^teste/([^\-]*)/([^\-]*)/([^\-]*)?$ /busca-cidade.php?locacao_venda=L&cidade=$1&tipo_mae=$2&tipo_imovel=$3 [L,QSA]
#(4) imobiliariaemaximovel.com.br/teste/Sorocaba/Apartamentos/Apto-Padrao
#GETREFERENCIA
RewriteRule ^(teste/[^\-]*)[\-]+(.*)([^\-]*)([^\-]*)([^\-]*)([^\-]*)$ $1\ $2 [DPI]
RewriteCond %{REQUEST_URI} !\-
RewriteRule ^teste/([^\-]*)/([^\-]*)/([^\-]*)/([^\-]*)/([^\-]*)?$ /tudo-imovel.php?codigo=$5 [L,QSA]
#(6) imobiliariaemaximovel.com.br/teste/Sorocaba/Apartamentos/Apto-Padrao/Jardim-Pacaembu/16538
#GET BAIRRO
RewriteRule ^(teste/[^\-]*)[\-]+(.*)([^\-]*)([^\-]*)([^\-]*)$ $1\ $2 [DPI]
RewriteCond %{REQUEST_URI} !\-
RewriteRule ^teste/([^\-]*)/([^\-]*)/([^\-]*)/([^\-]*)?$ /busca-cidade.php?locacao_venda=L&cidade=$1&tipo_mae=$2&tipo_imovel=$3&bairro=$4 [L,QSA]
#(5) imobiliariaemaximovel.com.br/teste/Sorocaba/Apartamentos/Apto-Padrao/Jardim-Pacaembu
#GET TIPO MAE
RewriteRule ^(teste/[^\-]*)[\-]+(.*)([^\-]*)$ $1\ $2 [DPI]
RewriteCond %{REQUEST_URI} !\-
RewriteRule ^teste/([^\-]*)/([^\-]*)?$ /busca-cidade.php?locacao_venda=L&cidade=$1&tipo_mae=$2 [L,QSA]
#(3) imobiliariaemaximovel.com.br/teste/Sorocaba/Apartamentos
#GET CIDADE LOCAÇÃO
RewriteRule ^(teste/[^\-]*)[\-]+(.*)$ $1\ $2 [DPI]
RewriteCond %{REQUEST_URI} !\-
RewriteRule ^teste/([^\-]+)$ /busca-cidade.php?locacao_venda=L&cidade=$1 [L,QSA]
#(2) imobiliariaemaximovel.com.br/teste/Sorocaba
语义顺序,然而,在我的htaccess中它令人困惑,但是工作rsrs
#(1) /teste
#(2) /teste/Sorocaba
#(3) /teste/Sorocaba/Apartamentos
#(4) /teste/Sorocaba/Apartamentos/Apto-Padrao
#(5) /teste/Sorocaba/Apartamentos/Apto-Padrao/Jardim-Pacaembu
#(6) /teste/Sorocaba/Apartamentos/Apto-Padrao/Jardim-Pacaembu/16538
答案 0 :(得分:1)
试试这个:
Options +FollowSymLinks
<IfModule mod_rewrite.c>
RewriteEngine on
# Internal rewrite to recursively replace hyphens with
# spaces, only on URIs that start with `/cidade`.
RewriteCond %{REQUEST_URI} ^/cidade
RewriteRule ^([^\-]*)[\-]+(.*)$ $1\ $2 [DPI]
# Now rewrite requests to the php file if only there's
# no hyphen in the request segment after `cidade/`.
RewriteCond %{REQUEST_URI} !\-
RewriteRule ^cidade/(.+)$ /busca-cidade.php?cidade=$1 [L]
</IfModule>
它映射:
www.dominio.com.br/cidade/sao-paulo
致:
www.dominio.com.br/busca-cidade.php?cidade=sao%20paulo
用空格字符替换所有连字符。
如果您还需要重写另一个细分,您只需要匹配上一个RewriteRule
中的细分。第一个替换整个请求URI中的连字符。
RewriteRule ^cidade/(.+)/(.+)$ /busca-cidade.php?cidade=$1&bairro=$2 [L]
关于你问题的latest update,我必须说有一种更好,更清洁的方法来达到同样的效果。
据我所知,除了将请求映射到tudo-imovel.php
文件的一个重写规则外,所有其他请求都被映射到busca-cidade.php
。您可以组合所有条件并仅通过2个重写规则实现相同的目标,而不是6。
但是,这种方法可能会产生轻微的副作用;它始终设置所有查询字符串参数(locacao_venda
,cidade
,tipo_mae
等),即使有些可能为空。这是由于多个规则组合在一起。
但是,据我所知,这并没有严重的问题。您唯一需要注意的是在empty()
变量上使用$_GET
(而不是使用isset()
来检查它是否已设置)。
Options +FollowSymLinks
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/teste
RewriteRule ^([^\-]*)[\-]+(.*)$ $1\ $2 [DPI]
RewriteCond %{REQUEST_URI} !\-
RewriteRule ^teste/(.+/){4}(\d+) /tudo-imovel.php?codigo=$2 [L,QSA]
RewriteCond %{REQUEST_URI} !\-
RewriteRule ^teste/?([^/]*)?/?([^/]*)?/?([^/]*)?/?([^/]*)?/?([^/]*)?$ /busca-cidade.php?locacao_venda=L&cidade=$1&tipo_mae=$2&tipo_imovel=$3&bairro=$4 [L,QSA]
RewriteCond %{QUERY_STRING} ^(.*)=&(.*)
</IfModule>
## Results:
#
# Maps this:
# /teste
# To:
# /busca-cidade.php?locacao_venda=L&cidade=&tipo_mae=&tipo_imovel=&bairro=
#
# Maps this:
# /teste/Sorocaba
# To:
# /busca-cidade.php?locacao_venda=L&cidade=Sorocaba&tipo_mae=&tipo_imovel=&bairro=
#
# Maps this:
# /teste/Sorocaba/Apartamentos
# To:
# /busca-cidade.php?locacao_venda=L&cidade=Sorocaba&tipo_mae=Apartamentos&tipo_imovel=&bairro=
#
# Maps this:
# /teste/Sorocaba/Apartamentos/Apto-Padrao
# To:
# /busca-cidade.php?locacao_venda=L&cidade=Sorocaba&tipo_mae=Apartamentos&tipo_imovel=Apto%20Padrao&bairro=
#
# Maps this:
# /teste/Sorocaba/Apartamentos/Apto-Padrao/Jardim-Pacaembu
# To:
# /busca-cidade.php?locacao_venda=L&cidade=Sorocaba&tipo_mae=Apartamentos&tipo_imovel=Apto%20Padrao&bairro=Jardim%20Pacaembu
#
# Maps this:
# /teste/Sorocaba/Apartamentos/Apto-Padrao/Jardim-Pacaembu/16538
# To:
# /tudo-imovel.php?codigo=16538
#
您看到我只使用了一个重写规则来替换这些连字符。你为每个重写规则重复它。这是不必要的,因为它递归替换所有连字符,然后转到其他重写规则。在替换所有连字符之前,请将RewriteCond %{REQUEST_URI} !\-
视为警卫。
不确定是否有一种简单的方法可以删除空查询字符串参数。由于你没有使用R
标志,所有这些都发生在引擎盖下,所以没有什么可烦的。