2013-10-13 9 views
6

Oto przepis w języku angielskim:Nginx reguła przepisywania dla CodeIgniter

Any HTTP request other than those for index.php, assets folder, files folder and robots.txt is treated as a request for your index.php file.

Mam plik .htaccess który działa poprawnie na serwerze Apache:

RewriteCond $1 !^(index\.php|assets|files|robots\.txt) 
RewriteRule ^(.*)$ index.php/$1 [L] 

Niektóre poprawnych wyników dla tej reguły:

example.com = example.com/index.php

example.com/index.php/welcome = example.com/welcome

example.com/assets/css/main.css! =example.com/index.php/assets/css/main.css

Próbowałem kilka narzędzi do konwersji z reguły .htaccess do Nginx reguła, ale wszystkie były błędne.

Via http://winginx.com/htaccess (brak zasady wyjątek dla folderu aktywów ...):

location/{ rewrite ^(.*)$ /index.php/$1 break; } 

Via http://www.anilcetin.com/convert-apache-htaccess-to-nginx/ (błąd w $ 1 wartość):

if ($1 !~ "^(index.php|assets|files|robots.txt)"){ 
    set $rule_0 1$rule_0; 
} 
if ($rule_0 = "1"){ 
    rewrite ^/(.*)$ /index.php/$1 last; 
} 

Jak mogę rozwiązać ten problem? Naprawdę trudno jest debugować regułę.

Oto moja nginx config do tej pory:

server { 
    listen  80; 
    server_name www.example.com example.com; 

    location/{ 
     try_files $uri $uri/ /index.php?/$request_uri; 
    } 

    location ~ \.php$ { 
     root   html; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; 
     include  fastcgi_params; 
    } 

    location ~ /\.ht { 
     deny all; 
    } 
} 
+0

Jaka jest Twoja główna ścieżka i pełna ścieżka do katalogu codeigniter? –

Odpowiedz

10

Możesz dodać to do swojej konfiguracji:

location ~* ^/(assets|files|robots\.txt) { } 

to będzie działać poprawnie z reguły location /.

Twoja konfiguracja wymaga również dodania dokumentu głównego i domyślnego pliku indeksu.

... 
root /ftp/wardrobe; 
index index.php index.html index.htm; 

location/{ 
    try_files $uri $uri/ /index.php?/$request_uri; 
} 

location ~* ^/(assets|files|robots\.txt) { } 
... 
+0

Mogę załadować stronę z lub bez index.php, ale nadal nie mogę załadować pliku w folderze zasobów – Letomkov

+1

Dodaj debugowanie "error_log /var/log/nginx/localhost.error_log; rewrite_log on; 'do konfiguracji, zrestartuj serwer, a następnie spróbuj załadować plik do folderu asset. Powiedz mi, jeśli widzisz jakiś błąd. – anvoz

+0

Jak mogę uzyskać błąd: 'open()"/etc/nginx/html/assets/... "failed (Brak takiego pliku lub katalogu)'? W regule brakuje czegoś, co pomaga w nginx trasie do poprawnego katalogu? – Letomkov

2

Chcesz to zrobić w zamian:

if ($request_uri !~ ^/(index\.php|assets|files|robots\.txt)) { 
    rewrite ^/(.*)$ /index.php/$1 last; 
} 

$request_uri jest dla oryginalnej URI żądania przez klienta. Jeśli chcesz, aby żądanie URI PO innych regułach przepisywania Nginx je przetworzyło, użyjesz $uri. Jednak to, co próbujesz zrobić, byłoby tym, czego chciałbyś.

Należy również unikać specjalnych znaków wyrażeń regularnych, takich jak ., używając odwróconego ukośnika.

+0

Wygląda na poprawny, ale nie działa. Oto wyniki niektórych przypadków: 'example.com' - 404,' example.com/index.php' - OK, 'example.com/assets/css/main.css' - 404. Czy mimo to mogę debugować zasada? – Letomkov

+0

@ Letomkov zaktualizuj swoje pytanie do zawartości pliku konfiguracyjnego Nginx. –

+0

Dodałem mój plik konfiguracyjny nginx do mojego pytania. Próbowałem zastąpić 'location/{...} 'reguła z twoim bieżącym pytaniem, ale to nie zadziałało. – Letomkov

0

Spróbuj tego. Mi to pasuje.

server { 
    server_name domain.tld; 

    root /var/www/codeignitor; 
    index index.html index.php; 

    # set expiration of assets to MAX for caching 
    location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ { 
     expires max; 
     log_not_found off; 
    } 

    location/{ 
     # Check if a file or directory index file exists, else route it to index.php. 
     try_files $uri $uri/ /index.php; 
    } 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 
}