O Apache reescreve todas as URLs para minúsculas se contiver pelo menos uma maiúscula

2

Eu tenho tentado fazer com que o Apache reescreva todas as URLs que contenham um caractere maiúsculo em qualquer lugar para ficarem em minúsculas. Todas as soluções que encontrei não funcionam no meu caso por algum motivo. Espero que alguém aqui possa me ajudar a descobrir o porquê.

O que eu quero é que, se alguém clicar em um URL em nossa página que seja assim http://example.com/products/productID/1234 eles são enviados para %código% em vez de. Observe que o ID está em minúsculas. Nem sempre será apenas http://example.com/products/productid/1234 se eu quiser que qualquer caractere maiúsculo seja convertido em minúsculas.

Basicamente, qualquer URL que visito não é alterado, o que me leva a acreditar que nem sequer está tentando reescrevê-los. Verifiquei também que ID não foi comentado.

Eu tentei as respostas aqui: Converter e URL de redirecionamento em maiúsculas para minúsculas usando .htaccess

Trecho do httpd.conf original

<VirtualHost *:80>
  ServerName dev.xxxxxxx.com
  DirectoryIndex default.cfm index.cfm index.htm index.html
  DocumentRoot "Z:/XXXXX"
  ServerAdmin [email protected]

  Redirect 301 /xxxxxxxxx/photoFiles https://www.xxxxxxxxx.com/xxxxxxxx/photoFiles
  ProxyPreserveHost On
  # ProxyPassMatch .*\.(jpg|png|gif|css|js|ico|htm|txt|csv|html|pdf|doc|docx|xls|xlsx)$ !
  # ProxyPass / balancer://nodes/ stickysession=JSESSIONID|jsessionid scolonpathdelim=on
  ProxyPassMatch ^/(.+\.cf[cm])(/.*)?$ ajp://dev.xxxxxxxx.com:7009/$1$2
  # ErrorDocument 404 /errors/404.cfm
</VirtualHost>

Excert de httpd.conf atualizado (não funcional)

<VirtualHost *:80>
  ServerName dev.xxxxxxx.com
  DirectoryIndex default.cfm index.cfm index.htm index.html
  DocumentRoot "Z:/XXXXX"
  ServerAdmin [email protected]

  RewriteEngine On
  RewriteMap  lc int:tolower
  RewriteCond %{REQUEST_URI} [A-Z]
  RewriteRule (.*) ${lc:$1} [R=301,L]

  Redirect 301 /xxxxxxxxx/photoFiles https://www.xxxxxxxxx.com/xxxxxxxx/photoFiles
  ProxyPreserveHost On
  # ProxyPassMatch .*\.(jpg|png|gif|css|js|ico|htm|txt|csv|html|pdf|doc|docx|xls|xlsx)$ !
  # ProxyPass / balancer://nodes/ stickysession=JSESSIONID|jsessionid scolonpathdelim=on
  ProxyPassMatch ^/(.+\.cf[cm])(/.*)?$ ajp://dev.xxxxxxxx.com:7009/$1$2
  # ErrorDocument 404 /errors/404.cfm
</VirtualHost>
    
por BigB8767 18.05.2016 / 19:40

2 respostas

0

Existem várias maneiras de fazer isso:

Em httpd.conf (não em um arquivo .htaccess ):

RewriteEngine on
RewriteBase /
RewriteMap lowercase int:tolower
RewriteCond $1 [A-Z]
RewriteRule ^/?(.*)$ /${lowercase:$1} [R=301,L]

Ou em .htaccess (YMMV com desempenho) - observe que S=28 significa ignorar as 28 regras a seguir (conforme Documentação do Apache ):

RewriteEngine On
RewriteBase /

# If there are caps, set HASCAPS to true and skip next rule
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]

# Skip this entire section if no uppercase letters in requested URL
RewriteRule ![A-Z] - [S=28]

# Replace single occurance of CAP with cap, then process next Rule.
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2

# If there are any uppercase letters, restart at very first RewriteRule in file.
RewriteRule [A-Z] - [N]

RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]

Ou usando mod_spelling (sua configuração sugere que você está usando o Windows para que o YMMV também esteja aqui):

<IfModule mod_speling.c>
  CheckCaseOnly On
  CheckSpelling On
</IfModule>

Fonte: link

    
por 18.05.2016 / 19:51
0

Se ProxyPass for o problema, você pode tentar o método RewiteMap , mas enviar o RewriteRule diretamente ao proxy usando o [P] flag , por exemplo, SOMETHING como:

RewriteEngine on
RewriteBase /
RewriteMap lowercase int:tolower
RewriteCond $2 [A-Z]
RewriteRule ^/(.+\.cf[cm])(/.*)?$ ajp://dev.xxxxxxxx.com:7009/$1${lowercase:$2} [P]
    
por 18.05.2016 / 21:27