使用htaccess重写规则

时间:2017-01-02 12:43:45

标签: regex apache .htaccess mod-rewrite url-rewriting

我有一个友好的网址如下:

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

1 个答案:

答案 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

用空格字符替换所有连字符。

更新1

如果您还需要重写另一个细分,您只需要匹配上一个RewriteRule中的细分。第一个替换整个请求URI中的连字符。

RewriteRule ^cidade/(.+)/(.+)$ /busca-cidade.php?cidade=$1&bairro=$2 [L]

更新2

关于你问题的latest update,我必须说有一种更好,更清洁的方法来达到同样的效果。

据我所知,除了将请求映射到tudo-imovel.php文件的一个重写规则外,所有其他请求都被映射到busca-cidade.php。您可以组合所有条件并仅通过2个重写规则实现相同的目标,而不是6。

但是,这种方法可能会产生轻微的副作用;它始终设置所有查询字符串参数(locacao_vendacidadetipo_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标志,所有这些都发生在引擎盖下,所以没有什么可烦的。