Saya ingin agar URL berikut di situs saya setara:
/foo/bar
/foo/bar/
/foo/bar/index.html
dan selanjutnya saya ingin dua bentuk kedua untuk mengeluarkan pengalihan HTTP 301 ke bentuk pertama. Saya hanya melayani halaman statis, dan mereka diatur sesuai dengan bentuk ketiga. (Dengan kata lain, ketika pengguna meminta /foo/bar
mereka harus menerima file di /usr/share/.../foo/bar/index.html
).
nginx.conf
Saat ini saya berisi yang berikut:
rewrite ^(.+)/$ $1 permanent;
index index.html;
try_files $uri $uri/index.html =404;
Ini berfungsi untuk permintaan /foo/bar/index.html
, tetapi ketika saya meminta /foo/bar
atau /foo/bar/
Safari memberi tahu saya bahwa "terlalu banyak pengalihan terjadi" - saya berasumsi ada loop pengalihan tak terbatas atau sesuatu seperti itu. Bagaimana saya bisa mendapatkan nginx untuk memetakan URL ke file dengan cara yang saya jelaskan?
Sunting: Konfigurasi lengkap saya
Ini seluruh saya nginx.conf
dengan nama domain saya diganti dengan "example.com".
user www-data;
worker_processes 1;
pid /run/nginx.pid;
events {
worker_connections 768;
}
http {
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;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
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 application/atom+xml text/javascript image/svg+xml;
server {
server_name www.example.com;
listen 80;
return 301 $scheme://example.com$request_uri;
}
server {
server_name example.com 123.45.67.89 localhost;
listen 80 default_server;
# Redirect /foobar/ to /foobar
rewrite ^(.+)/$ $1 permanent;
root /usr/share/nginx/www/example.com;
index index.html;
try_files $uri $uri/index.html =404;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
/foo/bar/index.html
harus mengembalikan file pada/usr/share/nginx/www/foo/bar/index.html
atau bagaimanapun itu sudah diatur. Semua jalur di situs web berhubungan langsung dengan jalur sistem file.Jawaban:
Memiliki regex ini di
server
blok Anda :akan mengarahkan semua URL garis miring ke masing-masing garis miring non.
sumber
Saya bisa mendapatkan perilaku yang saya inginkan dengan menggunakan ini sebagai
server
blok terakhir dalam konfigurasi saya:sumber
/index.html
URL dijawab dengan HTTP 200 alih-alih redirect; baris "tulis ulang" diabaikan. Apakah ini masih terkini?Jangan pernah gunakan menulis ulang:
sumber
rewrite ^(.+)/+$ $1 permanent;
rewrite
bisa buruk. Itu dikatakan, jawaban yang diberikan juga menangkap dan cocok dengan URI, saya tidak yakin apakah akan meningkatkan kinerja, perlu pengujian. Gunakan regex ini(?<no_slash>.+)/$
sebagai gantinya untuk tidak mengarahkan halaman beranda.Aturan ini akan menangani sejumlah garis miring dan akan mempertahankan URL. Ini juga akan menangani pemotongan garis dasar URL
sumber