2015-05-19 3 views
0

Я довольно новичок в Nginx, и я работаю над преобразованием файла .htaccess в нечто, что может понять nginx. Все работает хорошо (в основном) - я могу просто подтянуть домашнюю страницу. Проблема в том, когда я попадаю на страницу сообщений.Проблема с правилами перезаписи Nginx

думает похож на WordPress, URL, как:

http://www.example.com/12/post-title-in-slug-form 

Где 12 это пост идентификатора, и очевидно, что строка является пост слизняка. Я пытаюсь разобрать их как два отдельных аргумента (id & slug) и передать их в index.php, как я успешно делал в apache. Однако я получаю 404 страницы и подтвердил, что это связано с перезаписью. Вот что весь конфигурационный файл выглядит, только имя сайта изменилось (для конфиденциальности):

user www-data; 
worker_processes 4; 
pid /run/nginx.pid; 

events { 
     worker_connections 768; 
     # multi_accept on; 
} 

http { 

     ## 
     # Basic Settings 
     ## 

     sendfile on; 
     tcp_nopush on; 
     tcp_nodelay on; 
     keepalive_timeout 65; 
     types_hash_max_size 2048; 
     # server_tokens off; 

     # server_names_hash_bucket_size 64; 
     # server_name_in_redirect off; 

     include /etc/nginx/mime.types; 
     default_type application/octet-stream; 

     ## 
     # Logging Settings 
     ## 

     access_log /var/log/nginx/access.log; 
     error_log /var/log/nginx/error.log; 

     ## 
     # Gzip Settings 
     ## 

     gzip on; 
     gzip_disable "msie6"; 

     # gzip_vary on; 
     # gzip_proxied any; 
     # gzip_comp_level 6; 
     # gzip_buffers 16 8k; 
     # gzip_http_version 1.1; 
     # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 

     ## 
     # nginx-naxsi config 
     ## 
     # Uncomment it if you installed nginx-naxsi 
     ## 

     #include /etc/nginx/naxsi_core.rules; 

     ## 
     # nginx-passenger config 
     ## 
     # Uncomment it if you installed nginx-passenger 
     ## 

     #passenger_root /usr; 
     #passenger_ruby /usr/bin/ruby; 

     ## 
     # Virtual Host Configs 
     ## 

     include /etc/nginx/conf.d/*.conf; 
     include /etc/nginx/sites-enabled/*; 


     server { 
        listen 80; 
        server_name example.com; 

        access_log off; 
        error_log on; 

        # deny access to .XYZ files 
        location ~ /\. { 
         return 403; 
        } 

        location ~ sitemap\.xml { 
         return 301 http://example.com/sitemap.php; 
        } 

        location ~ .php$ { 
         # Here you have to decide how to handle php 
         # Generic example configs below 
         # Uncomment and fix up one of the two options 

         # Option 1: Use FastCGI 
         fastcgi_index index.php; 
         include fastcgi_params; 
         fastcgi_pass unix:/var/run/php5-fpm.sock; 
        } 

        location/{ 
         try_files $uri $uri/ @router; 
        } 

        location @router { 
         rewrite ^/([0-9]+)/?(.*)?/?$ /index.php?id=$1&slug=$2 last; 
        } 
     } 

} 

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

+0

Можете ли вы попытаться добавить '/' сразу после '^' вашего регулярного выражения, я думаю, что это необходимо. –

+0

К сожалению, я попробовал это, но больше не повезло. – carbide20

+0

Я думаю, что это очень хорошая идея добавить файл .htaccess, который вы хотите преобразовать в свой вопрос. В противном случае мы не знаем, что именно вы хотите преобразовать, и можете пропустить важные случаи краев. – Sven

ответ

1

Если то, что вы вывесили действительно ПОЛНЫЙ конфигурационный файл , то в настройке отсутствует что-то для обработки файлов PHP, поскольку регулярное выражение выглядит нормально.

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

Ниже приведена более подходящая конфигурация: FYI, try_files ABC XYZ last; Недопустимый синтаксис, и вам необходимо как минимум два параметра в файлах try_files. Во всяком случае, исправлены и те, что указаны в размещенной конфигурации.

server { 
    listen 80; 
    server_name example.com; 

    access_log off; 
    error_log on; 

    # deny access to .XYZ files 
    location ~ /\. { 
     return 403; 
    } 

    location ~ sitemap\.xml { 
     return 301 http://example.com/sitemap.php; 
    } 

    location ~ .php$ { 
     # Here you have to decide how to handle php 
     # Generic example configs below 
     # Uncomment and fix up one of the two options 

     # Option 1: Use FastCGI 
     #fastcgi_index index.php; 
     #include fastcgi_params; 
     #fastcgi_pass unix:/var/run/php5-fpm.sock; 

     # Option 2: Pass to Apache 
     # Proxy_pass localhost:APACHE_PORT 

    } 

    location/{ 
     try_files $uri $uri/ @router; 
    } 

    location @router { 
     rewrite ^/([0-9]+)/?(.*)/?$ /index.php?id=$1&slug=$2 last; 
    }  
} 

Вам нужно будет исправить бит обработки PHP и выбрать, какую установку вы хотите реализовать.

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

+0

Понятно, теперь все это имеет для меня гораздо больше смысла. Похоже, что была включена конфигурация по умолчанию в сайтах, которые я сделал резервную копию и удален. Возможно, это было добавление дополнительной конфигурации? Во всяком случае, я обновил свой файл конфигурации сейчас, чтобы соответствовать вашему примеру, и обновил исходное сообщение, чтобы теперь соответствовать моему файлу конфигурации. С момента обновления я перезапустил nginx. Я побежал: Судо Nginx -t Nginx: файл конфигурации /etc/nginx/nginx.conf синтаксис нормально Nginx: тест файл конфигурации /etc/nginx/nginx.conf успешно Домашняя страница загружает, вызывая индекс .php? id = 8 & slug = test также работает, но/8/тест еще 404. – carbide20

+0

Надеюсь, это поможет. Я начал работать с журналом, поэтому теперь мы можем видеть, что происходит: http://pastebin.com/yPjY0t3J – carbide20

+1

Кажется, вы используете другой файл conf или другой экземпляр Nginx. Бит, который говорит 'test location:« 50x.html », означает, что файл conf имеет блок местоположения размером 50x.html, который тот, который вы вставили выше, не имеет. Кроме того, бит, который говорит 'пытается использовать файл:" = 404 "' и т. Д., Означает, что файл conf имеет 'try_files $ uri $ uri/= 404;' под 'location /'. Вам нужно разобраться с вашей установкой. Многие люди используют сайты и доступную с сайта ctructure и считают, что это какой-то по умолчанию Nginx, но для меня это боль в шее и, вероятно, причина ваших проблем. Возможно, символическая ссылка-мошенник – Dayo

2

Вы должны добавить / в начале и / перед тем, как это index.php:

rewrite ^/([0-9]+)/?(.*)?/?$ /index.php?id=$1&slug=$2 last; 

Примечание я также использовал $1 и $2

+0

Не повезло с вашим предложением, к сожалению. Спасибо за советы. Я включил изменения в свой первоначальный вопрос. – carbide20

+0

Это сработало для меня. Можете ли вы прокомментировать блоки, содержащие 'if (! -e $ request_filename)' и посмотреть Также вы можете опубликовать раздел proxy_pass вашего файла конфигурации? –

+0

Пробовал комментировать строки request_filename, как вы предложили. По-прежнему получается тот же результат. У меня нет секции proxy_pass. Это что-то мне нужно, если у меня только одна страница без субдоменов? У меня есть pastebin'd мой полный файл конфигурации (только для меня имя веб-сайта изменено для конфиденциальности) здесь: http: // pastebin.com/zKdC72DJ – carbide20

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