2013-04-18 2 views
0

Мой сайт работает на Nginx, и я пытаюсь добавить программное обеспечение в подкаталог сайта, использующего правила mod_rewrite от Apache. Например. www.mydomain.com/mySubfolderApache mod_rewrite для правил перезаписи Nginx

Вот Apache .htaccess

#Options -Indexes 
<ifModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_URI} ^/system.* 
    RewriteRule ^(.*)$ index.php?/$1 [L] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.+)$ index.php?/$1 [L] 
</ifModule> 

До сих пор мне удалось получить главную страницу, чтобы работать, но при запросе страницы входа в систему, он вызывает URL перенаправления цикла. Например. www.myDomain.com/login При этом:

location /mySubfolder { 
if (!-e $request_filename) { 
rewrite ^(.*)$ /mySubfolder/index.php?q=$1 last; 
break; 
} 
} 

я читал и пытался узнать, как преобразовать Apache в Nginx и даже использовали .htaccess для Nginx преобразователя я нашел в http://winginx.com/htaccess но инструмент Безразлично» t, похоже, распознает часть% {REQUEST_URI} ^/system. *. После моего исследования и изучения, я придумал:

location /mySubfolder { 
if ($request_uri ~ "^/(system.*)$") { 
rewrite ^/(.*)$ index.php?/$1 last; 
} 
if (!-e $request_filename) { 
rewrite ^(.+)$ /mySubfolder/index.php?q=$1 last; 
break; 
} 
} 

Я полный нуб в этом и даже интересно, если я даже близко, чтобы выполнить это преобразование, чтобы работать. Пожалуйста помоги.

спасибо.

ответ

2

даже интересно, если я даже близко, чтобы выполнить это преобразование в работы

Вы в основном взяли неправильный подход к использованию в Nginx.

Хотя естественным предположить, что правила перезаписи в Apache будут сопоставлены с переписыванием в Nginx, они не являются. Вместо этого они в основном сопоставляются с правилами размещения.

Ваш блок для mySubfolder должен выглядеть следующим образом:

location ^/mySubfolder { 
    try_files /mySubfolder/index.php?$args =404; 
} 

Вы на самом деле не переписывать ничего - вы просто говорит Nginx, что любые запросы, которые начинаются с/MySubfolder должны обслуживаться файлы, перечисленные в try_files. Кстати, вы должны сказать Nginx передать строку запроса, через которую это делает args.

Вы можете добавить исходный URL (я думаю), хотя может быть проще просто использовать $_SERVER['REQUEST_URI'] внутри вашего скрипта.

Я считаю, что правило перезаписи для одного и того же начального URI вызывает совпадение/mySubFolder.

В Nginx переписывание используется только в том случае, если вы хотите, чтобы внешние URL-пути обслуживались разными внутренними URL-адресами, и правило перезаписи не находится внутри блока местоположения.

Например, у меня есть файловый сервер, обслуживающий изображения и другие файлы. У меня есть эти правила перезаписи в серверном блоке:

rewrite ^/image/(\d+)/(\w+)/(.+)\.([^\.]*)$ /proxy/proxyImage.php?typeID=$1&mode=$2&imagePath=$3.$4&resizeAllowed=TRUE&type=image last; 
    rewrite ^/image/(\d+)/(.+)\.([^\.]*)$ /proxy/proxyImage.php?typeID=$1&imagePath=$2.$3&resizeAllowed=TRUE last; 
    rewrite ^/file/(\d+)/(.+)\.([^\.]*)$ /proxy/proxyFile.php?typeID=$1&imagePath=$2.$3&resizeAllowed=FALSE last; 

, чтобы внешние URL выглядели красиво. Но все они обслуживаются блоком местоположения:

location ~* ^/proxy { 
     try_files $uri =404; 
     fastcgi_pass unix:/opt/local/var/run/php54/php-fpm-images.sock; 
     include  /documents/projects/intahwebz/intahwebz/conf/fastcgi.conf; 
    } 

Расположение блока не должны знать о URL переписывает, потому что они сделаны до того, как блок место встречается.

Смежные вопросы