Dlaczego mój alias nginx nie działa?

10

Próbuję skonfigurować alias, więc gdy ktoś uzyska dostęp /phpmyadmin/, nginx pobierze go /home/phpmyadmin/raczej niż ze zwykłego katalogu głównego dokumentu. Jednak za każdym razem, gdy ściągam URL, daje mi 404 na wszystkie przedmioty, które nie zostały przeciągnięte przez fastcgi. fastcgi wydaje się działać dobrze, podczas gdy reszta nie. stracemówi mi, że próbuje wyciągnąć wszystko inne ze zwykłego katalogu głównego dokumentu, ale nie mogę zrozumieć, dlaczego. Czy ktoś może zapewnić wgląd?

Oto odpowiednia część mojej konfiguracji:

            location ~ ^/phpmyadmin/(.+\.php)$
            {
                    include fcgi.conf;
                    fastcgi_index index.php;
                    fastcgi_pass  unix:/tmp/php-cgi.sock;
                    fastcgi_param SCRIPT_FILENAME /home$fastcgi_script_name;
            }

            location /phpmyadmin
            {
                    alias /home/phpmyadmin/;
            }
Obrabować
źródło
Jako długoletni użytkownik apache, nowy w Nginx, uważam to za naprawdę dziwne i niepotrzebnie skomplikowane. Spędziłem kilka godzin, przeglądając dokumentację, aby zrozumieć, dlaczego. Czy ktoś może wyjaśnić to zachowanie? Tak powinny wyglądać aliasy - alias lokalizacji.
Tu-Reinstate Monica-dor duh
O ile dobrze rozumiem, aliasy są „po prostu, że”, choć należy zauważyć, że jeśli pominąć końcowego znaku /w aliasu oraz z locationdyrektywy, żądając /phpmyadminfilerzeczywiście cię /home/phpmyadminfile. Jeśli chodzi o to, dlaczego konfiguracja w pytaniu nie działa, wydaje mi się, że jest poprawna, więc podejrzewam, że locationnie pokazano innej dyrektywy, która pasuje, gdy nie jest zamierzona. W takim przypadku, jako aliaskończące się locationprefiksem, dokumenty nginx sugerują użycie root /home;zamiast tego .
Scott Stevens,

Odpowiedzi:

12

Wymyśliłem sposób. Nie jestem pewien, czy to jest NAJLEPSZE, ale na pewno działa teraz.

Oto co zrobiłem:

        location ~ ^/phpmyadmin/(.*)$
        {
                alias /home/phpmyadmin/$1;
        }
Obrabować
źródło
2

Nie jestem pewien, ale czy próbowałeś napisać to w ten sposób:

location /phpmyadmin/
        {
                alias /home/phpmyadmin/;
        }

Ponadto, z jakiego identyfikatora URI próbujesz uzyskać do niego dostęp?

O ile rozumiem, musisz użyć URI

/home/phpmyadmin/

i nie tylko

/phpmyadmin/

Możesz przeczytać więcej na ten temat tutaj: http://wiki.nginx.org/HttpCoreModule

Czarny piksel
źródło
Przynajmniej dziękuję za odpowiedź. Ale tak. Próbowałem tego. Ta sama rzecz.
Rob
Być może musisz dodać alias do innej lokalizacji. Możesz porównać swoją konfigurację do tamtej: serverfault.com/questions/223028/…
Black-Pixel
1

Próbować

location ^~ /phpMyAdmin/
{
    alias /home/phpmyadmin/;

    location ~ \.php$
    {
        include fcgi.conf;
        fastcgi_index index.php;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_param SCRIPT_FILENAME /home$fastcgi_script_name;
    }
}
Kervin
źródło
1

Przyczyną tego nie jest to, że serwer wybiera lokalizację opartą na wyrażeniach regularnych, a nie lokalizację opartą na prefiksie, w której znajduje się alias.

Wybierze tylko jeden. Istnieje operator, za pomocą którego można uzyskać lokalizację opartą na prefiksie, aby przewyższać pozycję wyrażenia regularnego, ale wtedy okaże się, że php nie będzie działać. Rozwiązaniem będzie taka jak odpowiedź Kervina, w której wyrażenie regularne PHP jest zagnieżdżone w lokalizacji z dyrektywą aliasową.

Podejrzewam jednak, że jego ustawienie SCRIPT_FILENAME może tam nie działać, ponieważ w adresie URL i katalogu aliasu występuje inna wielkość liter.

thomasrutter
źródło