#url-rewriting #nginx #rewrite
#nginx #перезапись url
Вопрос:
у меня есть php-приложение под /path/
все, что не существует (файлы / каталоги), должно быть перенаправлено на /path/index.php
if (!-e $request_filename)
{
rewrite ^/path/(. )$ /path/index.php last;
}
и по какой-то причине все работает отдельно от реальных файлов.css-файлы, которые существуют, по-прежнему перенаправляются в индекс … например /path/CSS/style.css
Обновить
исправлено с помощью rewrite ^/path/(. )/$ /path/index.php last;
, потому что все мои URL-адреса, которые необходимо переписать, заканчиваются косой чертой, но все еще сбивают с толку
nginx.conf
http {
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
sendfile on;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_disable "MSIE [1-6].(?!.*SV1)";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
полная поддержка сайта /file
server {
listen valueyourvote.org.nz:80;
server_name valueyourvote.org.nz valueyourvote.co.nz;
if ($http_host != www.valueyourvote.org.nz) {
rewrite (.*) http://www.valueyourvote.org.nz$1;
}
access_log /var/log/nginx/valueyourvote.org.nz.access.log;
error_log /var/log/nginx/valueyourvote.org.nz.error.log;
location / {
root /var/www/vote.incode.co.nz/;
index index.php index.html index.htm;
}
if (!-e $request_filename)
{
rewrite ^/supercity-2010/(. )/$ /supercity-2010/index.php last;
}
# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ .php$ {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
location ~ /.ht {
deny all;
}
}
Ответ №1:
Вам следует избегать использования «if» в nginx, когда это возможно — см. «If is evil» в nginx Wiki. Для вашего использования лучшей директивой было бы использовать try_files.
Что касается неработающих директив, вы тестируете файлы за пределами области действия вашей директивы «root», то есть nginx не знает, где искать, чтобы увидеть, являются ли эти URI файлами!
Поместите директиву try_files внутри вашего блока location, и это должно сработать.
Комментарии:
1. я попытался,
try_files
основываясь на приведенной здесь информации michaelshadle.com/2009/03/19/… Но это не помогло, возможно, в другом месте конфигурации происходит что-то странное, но это всего лишь базовая установка на ubuntu, поэтому с ними все должно быть в порядке2. Если бы вы могли предоставить больше настроек nginx, возможно, мы смогли бы найти ошибку 🙂
Ответ №2:
Вы можете сделать вот так
location [your_location]{
try_files $uri $uri/ @w;
}
location @w {
rewrite ^/path/(. )$ /path/index.php last;
}