fragen stichworte

Apache schreibt alle URLs in Kleinbuchstaben um, wenn sie mindestens einen Großbuchstaben enthalten

Ich habe versucht, Apache dazu zu veranlassen, alle URLs, die an einer beliebigen Stelle Großbuchstaben enthalten, in Kleinschreibung umzuschreiben. Alle Lösungen, die ich gefunden habe, funktionieren aus irgendeinem Grund nicht in meinem Fall. Ich hoffe, dass mir hier jemand helfen kann, warum.

Was ich möchte, ist, wenn jemand auf eine URL auf unserer Seite klickt, die so aussieht wie http://example.com/products/productID/1234 Sie werden zu geschickt http://example.com/products/productid/1234 stattdessen. Beachten Sie, dass die ID in Kleinbuchstaben ist. Es ist nicht immer nur ID. Ich möchte, dass Großbuchstaben in Kleinbuchstaben umgewandelt werden.

Grundsätzlich wird jede URL, die ich besuche, nicht geändert, was mich zu der Annahme führt, dass sie nicht einmal versucht, sie neu zu schreiben. Ich habe bestätigt, dass das rewrite_module ebenfalls unkommentiert ist.

Ich habe die Antworten hier ausprobiert: Konvertieren Sie die URL in Großbuchstaben in Kleinbuchstaben und verwenden Sie sie .htaccess

Auszug aus der ursprünglichen httpd.conf

<VirtualHost *:80>
  ServerName dev.xxxxxxx.com
  DirectoryIndex default.cfm index.cfm index.htm index.html
  DocumentRoot "Z:/XXXXX"
  ServerAdmin technical@xxxxxxxxx.com

  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>

Aktualisierung der aktualisierten (nicht funktionierenden) httpd.conf

<VirtualHost *:80>
  ServerName dev.xxxxxxx.com
  DirectoryIndex default.cfm index.cfm index.htm index.html
  DocumentRoot "Z:/XXXXX"
  ServerAdmin technical@xxxxxxxxx.com

  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>

antworten

Es gibt mehrere Möglichkeiten, dies zu tun:

In httpd.conf (nicht in einer .htaccess Datei):

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

Oder in .htaccess (YMMV mit Leistung) - beachten Sie, dass S=28 bedeutet, die folgenden 28 Regeln zu überspringen (gemäß der Apache-Dokumentation):

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]

Oder verwenden Sie mod_spelling (Ihre Konfiguration schlägt vor, dass Sie Windows verwenden, also auch hier YMMV):

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

Quelle: http://www.askapache.com/htaccess/rewrite-uppercase-lowercase.html

Wenn ProxyPass das Problem ist, können Sie die RewiteMap -Methode ausprobieren, aber die RewriteRule -Methode mit dem [P] flag direkt an den Proxy-Server senden, beispielsweise SOMETHING wie:

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