Вот правило на английском языке:
Любой HTTP-запрос, отличный от тех, которые относятся к папке index.php, assets, папке файлов и robots.txt, рассматривается как запрос для вашего файла index.php.
У меня есть файл .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, но все были неверными.
Через http://winginx.com/htaccess (отсутствует правило исключений для папки с ресурсами …):
location / { rewrite ^(.*)$ /index.php/$1 break; }
Через 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; } }
Вы можете добавить это в свой конфиг:
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) { } ...
Вы хотите сделать это вместо этого:
if ($request_uri !~ ^/(index\.php|assets|files|robots\.txt)) { rewrite ^/(.*)$ /index.php/$1 last; }
$ request_uri – для первоначального запроса URI клиентом. Если вы хотите, чтобы запрос URI ПОСЛЕ других правил перезаписи Nginx обработал его, вы использовали бы $ uri . Однако то, что вы пытаетесь сделать, было бы тем, что вы хотели бы.
Кроме того, вам нужно избегать специальных символов регулярного выражения, например .
используя обратную косую черту.
Пожалуйста, попробуйте это. Меня устраивает.
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; } }