2013-02-11 5 views
15

Pracuję na stronie internetowej, która jest wdrażana na serwerze Linux. Mam do tego małe zmiany. Mam folder read. Wymagane jest, aby po wpisaniu adresu URL localhost:80/tom/Read lub ../READ lub /read przejść do read.php w folderze read.W jaki sposób uczynić adresy URL nieczułymi na wielkość liter w serwerze Linux

Utworzono plik .htaccess w katalogu głównym. Umieszczony poniżej kod następujący zapis w pliku widząc strona mentioned here

RewriteEngine On 
RewriteBase /tom/ 

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

RewriteCond %{REQUEST_URI} ^system.* 
RewriteRule ^(.*)$ /index.php/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L] 

RewriteRule ![A-Z] - [S=26] 
RewriteRule ^(.*)(A)(.*)$ $1a$3 [N,R=301] 
RewriteRule ^(.*)(B)(.*)$ $1b$3 [N,R=301] 
RewriteRule ^(.*)(C)(.*)$ $1c$3 [N,R=301] 
RewriteRule ^(.*)(D)(.*)$ $1d$3 [N,R=301] 
RewriteRule ^(.*)(E)(.*)$ $1e$3 [N,R=301] 
RewriteRule ^(.*)(F)(.*)$ $1f$3 [N,R=301] 
RewriteRule ^(.*)(G)(.*)$ $1g$3 [N,R=301] 
RewriteRule ^(.*)(H)(.*)$ $1h$3 [N,R=301] 
RewriteRule ^(.*)(I)(.*)$ $1i$3 [N,R=301] 
RewriteRule ^(.*)(J)(.*)$ $1j$3 [N,R=301] 
RewriteRule ^(.*)(K)(.*)$ $1k$3 [N,R=301] 
RewriteRule ^(.*)(L)(.*)$ $1l$3 [N,R=301] 
RewriteRule ^(.*)(M)(.*)$ $1m$3 [N,R=301] 
RewriteRule ^(.*)(N)(.*)$ $1n$3 [N,R=301] 
RewriteRule ^(.*)(O)(.*)$ $1o$3 [N,R=301] 
RewriteRule ^(.*)(P)(.*)$ $1p$3 [N,R=301] 
RewriteRule ^(.*)(Q)(.*)$ $1q$3 [N,R=301] 
RewriteRule ^(.*)(R)(.*)$ $1r$3 [N,R=301] 
RewriteRule ^(.*)(S)(.*)$ $1s$3 [N,R=301] 
RewriteRule ^(.*)(T)(.*)$ $1t$3 [N,R=301] 
RewriteRule ^(.*)(U)(.*)$ $1u$3 [N,R=301] 
RewriteRule ^(.*)(V)(.*)$ $1v$3 [N,R=301] 
RewriteRule ^(.*)(W)(.*)$ $1w$3 [N,R=301] 
RewriteRule ^(.*)(X)(.*)$ $1x$3 [N,R=301] 
RewriteRule ^(.*)(Y)(.*)$ $1y$3 [N,R=301] 
RewriteRule ^(.*)(Z)(.*)$ $1z$3 [N,R=301] 

Ale to nie działa.

Jestem nowy w środowisku Linux. Nie wiem o mod_speling. Czy to jest plik? Gdzie będzie zlokalizowany na serwerze Linux?

+1

Chciałbym zakwestionować specyfikację tutaj. Doprowadziłoby to do większej liczby problemów, na przykład indeksowania botów. –

+0

możliwy duplikat [Rozróżnianie wielkości liter w adresie z mod \ _rewrite] (http://stackoverflow.com/questions/1998156/case-insensitive-urls-with-mod-rewrite) –

+0

Tak, wymaganie może być problemem w samo. Powiedział, że istnieje moduł Apache, który może pomóc (to ten, który może obsłużyć żądania, które są nieco off i służyć alternatywę ... Zapomniałem nazwę) Edit: to 'MultiViews' –

Odpowiedz

25

Można łatwo zrobić serwer WWW Apache zignorować sprawę za pomocą modułu mod_speling, która jest częścią standardowej dystrybucji apache:

CheckSpelling On 
CheckCaseOnly On 

Po ponownym httpd można uzyskać dostęp read jak Read lub READ lub read.

+0

Cześć Hoeni .. Umieściłem powyższy kod 2 linii w .htaccess z już obecnym kodem. Następnie uruchomiłem ponownie. To nie działa. Wszelkie sugestie – sonorita

+0

Zastanawiam się, czy istnieją jakiekolwiek rozważania wydajności podczas korzystania z tego. Mam dużą aplikację Sencha, która ma ten problem. 390 MB wszystkich plików o różnych rozmiarach i różnych odniesień w całym tekście. –

+19

Czy jestem jedynym, który ironizuje, że moduł do sprawdzania pisowni jest błędnie napisany? – Dave

18

Witam Mam rozwiązanie w końcu. Umieszczono poniższy kod w /etc/httpd/conf/httpd.conf.

LoadModule speling_module modules/mod_speling.so 

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

Następnie uruchom httpd:

sudo service httpd restart 

I wreszcie sprawdzić, czy jest włączona:

sudo httpd -M | grep speling 

To powinno dawać speling_module (shared)

dzięki za pomoc dla wszystkich ..

+0

Dyrektywa IfModule nie powinna w ogóle nic zmieniać, ponieważ służy unikaniu błędów, gdy ** nie ** ładuj modułu. (http://httpd.apache.org/docs/2.4/mod/core.html#ifmodule). Gdy masz błędy bez niego, moduł mod_speling nie jest w ogóle załadowany. – hoeni

+2

Moduł 'speling' nie jest domyślnie włączony na Debianie (prawdopodobnie także w systemie Ubuntu). Aby go włączyć, użyj polecenia 'sudo a2enmod speling'. – Dave

+0

Myślę, że błędnie napisany moduł jest absolutnie fantastyczny. – ScottMcGready

1

Nie jestem pewien, czy to pomaga, ale jest to prosta operacja, której użyłem, używa ona bardzo prostej strony php, ale działa na stronie, której potrzebowałem.

Umieść ten kod w pliku .htaccess

AddType application/x-httpd-php .html .htm 
ErrorDocument 404 /404.php 

Mam następnie utworzony plik php dowcip o następującej ..

<?php 
$aurl = $_SERVER['REQUEST_URI']; 
$lurl = strtolower($aurl); 

if($aurl != $lurl){ 
header('location:'.$lurl); 
} else { 
header('location:/404.html'); 
} 
?> 

Zasadniczo dostaje URL odnoszący -> Stores as $ aurl

następnie tworzy małą literę -> sklepy jako $ lurl

jeśli nie pasują do niego, a następnie próbuje wyświetlić adres URL małej litery ($ lurl)

Jeśli to się nie uda, strona nie istnieje, adres URL jest teraz taki sam ($ lurl == $ aurl) , więc przekierowuje do właściwą stronę 404 lub można wyświetlić dodatkowy kod.

+1

Dlaczego '} else {header (" location: /404.html "); } '? Czy nie powinno być po prostu pozostawione bez przekierowania, jeśli '$ aurl == $ lurl'? – tnschmidt

2

Najpierw zainstaluj speling_module. Następnie włącz LoadModule speling_module modules/mod_speling.so w httpd.conf, a następnie obejmować

<IfModule mod_speling.c> CheckSpelling On CheckCaseOnly On </IfModule>
w httpd.conf, a następnie ponownie uruchomić usługę httpd httpd użyciu polecenia Uruchom ponownie usługę .