Ngnix 301 redirect - nginx

I'm using nginx.
Nginx is not working properly routing the short address.
Sorry, I'm using google translate. My English bad.
Example;
location /a {
return 301 http://www.example.com/abcd;
}
Or
location /a {
rewrite ^(.*)$ http://www.example.com/abcd permanent;
}
Doesn't work.
Response: Too many redirects;
>>> http://www.example.com/a
> --------------------------------------------
> 301 Moved Permanently
> --------------------------------------------
Status: 301 Moved Permanently
Code: 301
Server: nginx
Date: Fri, 16 Oct 2015 23:46:00 GMT
Content-Type: text/html
Content-Length: 178
Connection: close
Location: http://www.example.com/abcd
>>> http://www.example.com/abcd
> --------------------------------------------
> 301 Moved Permanently
> --------------------------------------------
Status: 301 Moved Permanently
Code: 301
Server: nginx
Date: Fri, 16 Oct 2015 23:46:00 GMT
Content-Type: text/html
Content-Length: 178
Connection: close
Location: http://www.example.com/abcd
>>> http://www.example.com/abcd
> --------------------------------------------
> 301 Moved Permanently
> --------------------------------------------
Status: 301 Moved Permanently
Code: 301
Server: nginx
Date: Fri, 16 Oct 2015 23:46:01 GMT
Content-Type: text/html
Content-Length: 178
Connection: close
Location: http://www.example.com/abcd
>>> http://www.example.com/abcd
> --------------------------------------------
> 301 Moved Permanently
> --------------------------------------------
Status: 301 Moved Permanently
Code: 301
Server: nginx
Date: Fri, 16 Oct 2015 23:46:01 GMT
Content-Type: text/html
Content-Length: 178
Connection: close
Location: http://www.example.com/abcd
But long address successful;
location /what-can-i-do {
rewrite ^(.*)$ http://www.example.com/please-help-me permanent;
}
My /etc/nginx/sites-available/example.com configuration;
server {
server_name example.com www.example.com;
if ($http_host = example.com) {
return 301 http://www.example.com$request_uri;
}
listen 00.00.00.00:80;
root /home/example/public_html;
index index.html index.htm index.php;
access_log /var/log/virtualmin/example.com_access_log;
error_log /var/log/virtualmin/example.com_error_log;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME /home/example/public_html$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT /home/example/public_html;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS $https;
location /a {
return 301 http://www.example.com/abcd;
}
location /ajax {
add_header "Access-Control-Allow-Origin" "*";
try_files $uri $uri/ /index.php?$args;
}
set $no_cache "";
if ($request_method = POST)
{
set $no_cache 1;
}
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 444;
}
server_tokens off;
server_name_in_redirect off;
location ~* .(ico|webp|css|js|ico|bmp|zip|woff)$
{
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
try_files $uri /index.html;
}
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
expires 1M;
access_log off;
add_header Cache-Control "public";
}
location ~* \.(?:css|js)$ {
expires 1y;
access_log off;
add_header Cache-Control "public";
}
location / {
try_files $uri $uri/ #rewrites;
}
location #rewrites {
if (!-e $request_filename)
{
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
}
location = /favicon.ico {
access_log off;
log_not_found off;
}
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
fastcgi_intercept_errors on;
location ~ \.php {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass_header Set-Cookie;
fastcgi_pass_header Cookie;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
listen 00.00.00.00:00 default ssl;
ssl_certificate /home/example/ssl.cert;
ssl_certificate_key /home/example/ssl.key;
}

Anything that follows /a is sent to /abcd which matches the /a given the current options=> When /a is requested, redirect to /a => An infinate loops occurs.
location /a {
return 301 http://www.example.com/abcd;
}
Change it into location = /a { and it will behave differently.
tl;dr
A location block looks like this:
location optional_modifier location_match {
. . .
}
Here's a very informative page, quote about the optional_modifier:
(none): If no modifiers are present, the location is interpreted as a prefix match. This means that the location given will be matched against the beginning of the request URI to determine a match.
=: If an equal sign is used, this block will be considered a match if the request URI exactly matches the location given.
...
Hence, set it to = to make a direct match, or any of the other options available.

Related

How to use NGNIX directives to redirect all requests to files in a directory except for requests to files in a specific subdirectory?

I have a wordpress site where we want to control access to files in the media library. This means all files inside the /uploads/ directory need to be inaccessibile to non-logged-in users with the exception of a single subdirectory of files, /uploads/public/. I have a file called auth.php in the root of my site that does the actual permission checking. Currently there is not an exception for files inside the /public/ directory. Also, auth.php appears not to be called with this directive added to the server {} block in my site.conf.hbs file in my local ngnix environment. Here are the contents of my site.conf.hbs file. My directive is at the bottom:
upstream php {
{{#each fastcgi_servers}}
server {{this}};
{{/each}}
}
server {
listen {{port}};
root "{{root}}";
index index.php index.html index.htm;
#
# Generic restrictions for things like PHP files in uploads
#
include includes/restrictions.conf;
#
# Gzip rules
#
include includes/gzip.conf;
#
# WordPress Rules
#
{{#unless site.multiSite}}
include includes/wordpress-single.conf;
{{else}}
include includes/wordpress-multi.conf;
{{/unless}}
#
# Forward 404's to WordPress
#
error_page 404 = #wperror;
location #wperror {
rewrite ^/(.*)$ /index.php?q=$1 last;
}
#
# Static file rules
#
location ~* \.(?:css|js)$ {
access_log off;
log_not_found off;
add_header Cache-Control "no-cache, public, must-revalidate, proxy-revalidate";
}
location ~* \.(?:jpg|jpeg|gif|png|ico|xml)$ {
access_log off;
log_not_found off;
expires 5m;
add_header Cache-Control "public";
}
location ~* \.(?:eot|woff|woff2|ttf|svg|otf) {
access_log off;
log_not_found off;
expires 5m;
add_header Cache-Control "public";
# allow CORS requests
add_header Access-Control-Allow-Origin *;
}
#
# PHP-FPM
#
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $host;
fastcgi_param HTTPS $fastcgi_https;
fastcgi_param REDIRECT_STATUS 200;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php;
fastcgi_buffer_size 64k;
fastcgi_buffers 32 32k;
fastcgi_read_timeout 1200s;
proxy_buffer_size 64k;
proxy_buffers 32 32k;
proxy_busy_buffers_size 256k;
}
# Protect all uploads:
if (-e $request_filename){
rewrite ^/wp-content/uploads/(.*)$ /auth.php?file=$1 break;
}
}
If it helps, here is the first chunk of code in my auth.php file that I'm using right now to ensure we're even hitting auth.php:
<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
define('WP_USE_THEMES', false);
require_once('wp-load.php');
wp_die('We made it to auth.php');
Nginx will choose the more specific prefix location, so to catch /wp-content/uploads/ but exclude /wp-content/uploads/public/, you could use two prefix locations.
For example:
location ^~ /wp-content/uploads/ {
if (-e $request_filename){
rewrite ^/wp-content/uploads/(.*)$ /auth.php?file=$1 last;
}
}
location ^~ /wp-content/uploads/public/ {
log_not_found off;
expires 5m;
add_header Cache-Control "public";
}
The ^~ is necessary to avoid the other location blocks (static file rules) taking precedence (see this document for details). It also prevents the ability to upload PHP files to your server and execute them.
The if block prevents /auth.php receiving requests for files that do not exist. The rewrite...last is necessary to pass control to location ~ \.php$. See this document for details.
The second location block contains appropriate cache control rules for the public folder.

How to make 2 servers on nginx. One just accessible by IP and another one just by localhost

I have a 2 folders with different sites on my server
One is /var/www/html which I want to be accessible by my IP:80 other is denny
One is /var/www/cats which I want to be accessible by my localhost:80 and other is denny
How could I figure out it in my nginx settings?
UPD. 1
Well I have 2 configs
sudo nano /etc/nginx/sites-enabled/default
server {
listen 122.111.111.40:80;
root /var/www/html/;
index /;
server_name 122.111.111.40;
location / {
allow 122.111.111.40;
deny all;
autoindex on;
index index.php;
try_files $uri /index.html /index.php;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
sudo nano /etc/nginx/sites-enabled/cats
server {
listen 127.0.0.1:80;
root /var/www/cats/;
index /index.php;
server_name localhost;
location / {
allow 127.0.0.1;
deny all;
autoindex on;
index index.php;
try_files $uri /index.html /index.php;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
While I access localhost it's okay. I have my route to cats/index.php folder working fine. While I route to my IP I have 403 Forbidden It's says
2020/09/22 05:44:02 [error] 17563#17563: *853 access forbidden by rule, client: 115.111.11.111, server: localhost, request: "GET / HTTP/1.1", host: "122.111.111.40".
So some problem with my config. But I could not understand which one. If I will request my IP/index.php I will see an index page of cats/index.php but that's should be html/index.php. Right?
UPD. 2
Adding sudo nano /etc/nginx/snippets/fastcgi-php.conf
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;
UPD. 3
Adding sudo nano /etc/nginx/fastcgi.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
Assuming you don't have any other sites, following config should work:
server {
listen <ip>:80;
root /var/www/html;
...
}
server {
listen 127.0.0.1:80;
root /var/www/cats;
...
}

Why nginx not serve .gz files?

I have next nginx conf:
server {
listen 80;
server_name ~^(www\.)?(?<sname>.+?).site.ru$;
root /var/www/kvz/$sname.site.ru/web;
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri /app.php$is_args$args;
}
location ~ ^/static/ {
gzip_static on;
expires max;
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
}
# DEV
location ~ ^/(app_dev|config)\.php(/|$) {
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
# PROD
location ~ ^/app\.php(/|$) {
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
internal;
}
access_log /var/log/nginx/$sname-access.log;
error_log /var/log/nginx/$sname-error.log debug;
}
And in my static directory exists file.js and file.js.gz. But when i request file.js nginx not serve file.js.gz. Why? In this question writed that this work. What wrong in my config?

Nginx and PHP-FPM doesn't work in vhost

I am trying to move a project to Nginx + PHP-FPM with a virtual host. But when I try to load the website, I receive a file called 'download' with the contents of the index.php.
contents of nginx.conf:
user nginx nginx;
worker_processes 4;
worker_rlimit_nofile 64000;
error_log /var/log/nginx/error_log debug;
events {
worker_connections 16000;
multi_accept on;
use epoll;
}
http {
log_format main
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
access_log on;
disable_symlinks if_not_owner;
ignore_invalid_headers on;
server_tokens off;
keepalive_timeout 20;
client_header_timeout 20;
client_body_timeout 20;
reset_timedout_connection on;
send_timeout 20;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
charset UTF-8;
gzip on;
gzip_vary on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js image/x-icon image/bmp;
server {
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi.conf;
fastcgi_pass unix:/run/php-fpm.socket;
fastcgi_index index.php;
}
}
include /etc/nginx/sites-enabled/*;
}
contents of the vhost file:
server {
listen 127.0.0.1:80;
server_name yps.dev;
access_log /var/log/nginx/yps.access_log main;
error_log /var/log/nginx/yps.error_log debug;
root /home/bobbles/projects/yps_upstream/www/public;
index index.cgi index.htm index.html index.php;
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi.conf;
fastcgi_pass unix:/run/php-fpm.socket;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
}
The included fastcgi parameters:
# cat /etc/nginx/fastcgi.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
the PHP-FPM pool:
[www]
listen =/run/php-fpm.socket
listen.owner = nginx
listen.mode = 0666
user = nobody
group = nobody
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
the socket:
# ls -al /run/php-fpm.socket
srw-rw-rw- 1 nginx nginx 0 Oct 12 22:12 /run/php-fpm.socket
In the access logs and the error logs, there is no output except a timeout in the error log:
==> /var/log/nginx/error_log <==
2014/10/12 22:15:39 [info] 3317#0: *19 client closed connection while waiting for request, client: 127.0.0.1, server: 0.0.0.0:80
2014/10/12 22:15:39 [info] 3317#0: *20 client closed connection while waiting for request, client: 127.0.0.1, server: 0.0.0.0:80
The access log is silent.
What am I doing wrong? /var/log/fpm-php.www.log never gets created, so I assume that means that the request is never getting to php-fpm, but then what is wrong with my nginx config?
EDIT:
This is what happens when I try to access a static file from the directory:
==> /var/log/nginx/localhost.error_log <==
2014/10/12 21:16:04 [error] 3021#0: *3 openat() "/usr/share/nginx/html/email.html" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /email.html HTTP/1.1", host: "yps.dev"
==> /var/log/nginx/localhost.access_log <==
127.0.0.1 - - [12/Oct/2014:21:16:04 +0200] "GET /email.html HTTP/1.1" 404 410 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.101 Safari/537.36" "3.10"
==> /var/log/nginx/yps.error_log <==
2014/10/12 21:16:23 [info] 3021#0: *4 client closed connection while waiting for request, client: 127.0.0.1, server: 0.0.0.0:80
apparently the request is simultaneously being passed to the yps virtualhost, and not.
this is an updated version of your vhost file that might work :
server {
listen 80;
server_name yps.dev;
access_log /var/log/nginx/yps.access_log main;
error_log /var/log/nginx/yps.error_log debug;
root /home/bobbles/projects/yps_upstream/www/public;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ #handler;
}
location #handler {
rewrite / /index.php;
}
location ~ \.php$ {
if (!-e $request_filename) { rewrite / /index.php last; } ## Catch 404s that try_files miss
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php-fpm.socket;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
include /etc/nginx/fastcgi.conf;
}
}

Nginx starts but site not loading? Unable to connect

Just installed nginx and php-fpm on centos 5.10 but I can't get it to work. There is ping to the server IPs but when I try to open the domains... I am not able to connect. When I restart nginx, it says OK (no errors). Error logs are empty. No matter the domains and IPs. There will be several domains on several IPs running custom php script. What did I miss??
Here is my config:
nginx.conf
user myusername;
worker_processes 4;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 2;
gzip on;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain text/css
application/x-javascript text/xml
application/xml application/xml+rss
text/javascript;
server_tokens off;
include /sites-enabled/*.conf;
}
several of these: sites-enabled/example.com.conf
server {
listen xxx.xxx.xxx.xxx:80;
server_name example.com;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
root /var/www/html/example.com;
index index.php;
}
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires max;
}
location ~* \.php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
error_page 404 /404.php;
# redirect server error pages to the static page /50x.php
#
error_page 500 502 503 504 /50x.php;
location = /50x.php {
root /var/www/html/example.com;
}
set $mobile_rewrite do_not_perform;
## chi http_user_agent for mobile / smart phones ##
if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") {
set $mobile_rewrite perform;
}
if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {
set $mobile_rewrite perform;
}
## redirect to m.example.com ##
if ($mobile_rewrite = perform) {
rewrite ^ http://m.example.com$request_uri? redirect;
break;
}
}
server {
listen xxx.xxx.xxx.xxx:80;
server_name m.example.com;
access_log /var/log/nginx/m.example.com.access.log;
error_log /var/log/nginx/m.example.com.error.log;
location / {
root /var/www/html/example.com/m;
index index.php;
}
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires max;
}
location ~* \.php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
error_page 404 /404.php;
# redirect server error pages to the static page /50x.php
#
error_page 500 502 503 504 /50x.php;
location = /50x.php {
root /var/www/html/example.com/m;
}
}
server {
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
server_name www.m.example.com;
return 301 $scheme://m.example.com$request_uri;
}
fastcgi_params
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

Resources