2013-10-13 3 views
6

Вот правило на английском языке:Nginx правило перезаписи для 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.

У меня есть .htaccess файл, который работает правильно на Apache сервере:

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

Некоторые правильные результаты для этого правила:

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

Я пробовал некоторые инструменты для преобразования из правила HTAccess в Nginx правило, но все они были неправильными.

Via http://winginx.com/htaccess (отсутствующие правила исключения для папки активов ...):

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

Via http://www.anilcetin.com/convert-apache-htaccess-to-nginx/ (ошибка в $ 1 значение):

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

Как я могу это исправить? Это правило очень сложно отладить.

Вот мой Nginx конфигурации до сих пор:

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

Какова ваша корневая дорожка и полный путь в вашем каталоге codeigniter? –

ответ

10

Вы можете добавить это к вашей конфигурации:

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

Это будет правильно работать с location / правилом.

В вашей конфигурации также необходимо добавить корневой документ и файл индекса по умолчанию.

... 
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

Я могу загрузить страницу с индексом index.php или без него, но все равно не могу загрузить файл в папке с ресурсами. – Letomkov

+1

Добавить 'error_log /var/log/nginx/localhost.error_log debug; rewrite_log on; 'в вашу конфигурацию, перезапустите сервер, затем попробуйте загрузить файл в папку с ресурсами. Скажите, если вы видите какую-либо ошибку. – anvoz

+0

Как я могу получить сообщение об ошибке: 'open()"/etc/nginx/html/assets/... "failed (Нет такого файла или каталога)'? В правиле отсутствует то, что помогает nginx-маршруту для исправления веб-каталога? – Letomkov

2

Вы хотите сделать это вместо того, чтобы:

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

$request_uri для первоначального запроса URI клиентом. Если вы хотите, чтобы запрос URI ПОСЛЕ других правил перезаписи Nginx обработал его, вы должны использовать $uri. Однако то, что вы пытаетесь сделать, было бы тем, что вы хотели бы.

Кроме того, вам необходимо избегать специальных символов регулярного выражения, таких как ., с помощью обратного слэш.

+0

Кажется правильным, но не работает. Ниже приведены результаты некоторых примеров: 'example.com' - 404,' example.com/index.php' - ОК, 'example.com/assets/css/main.css' - 404. В любом случае я могу отлаживать правило? – Letomkov

+0

@Letomkov обновляет ваш вопрос с содержимым вашего конфигурационного файла Nginx. –

+0

Я добавил свой файл конфигурации nginx к моему вопросу. Я попытался заменить 'location/{...} 'с вашим текущим вопросом, но это не сработало. – Letomkov

0

Пожалуйста, попробуйте это. Меня устраивает.

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; 
    } 
} 
Смежные вопросы