2009-03-14 39 views
37

tôi cố gắng để có được một "/" để mỗi url cuối:Thêm dấu gạch chéo để cuối mỗi url (cần viết lại quy tắc cho nginx)

example.com/art

nên

dụ .com/art/

Tôi sử dụng nginx làm máy chủ web.

tôi cần viết lại quy tắc cho điều này ..

Đối với sự hiểu biết tốt hơn kiểm tra này:

http://3much.schnickschnack.info/art/projekte

Nếu u nhấn vào hình nhỏ nhỏ dưới bức tranh lớn nó tải lại và cho thấy url này:

http://3much.schnickschnack.info/art/projekte/#0

Nếu tôi bây giờ có một dấu gạch chéo trên tất cả các url (ở cuối dòng) nó wo uld làm việc mà không cần tải lại trang web.

Ngay bây giờ tôi có các cài đặt này trong nginx-http.conf:

server { 
    listen *:80; 
    server_name 3much.schnickschnack.info; 
    access_log /data/plone/deamon/var/log/main-plone-access.log; 
    rewrite ^/(.*)$ /VirtualHostBase/http/3much.schnickschnack.info:80/2much/VirtualHostRoot/$1 last; 
    location/{ 
    proxy_pass http://cache; 
    } 
} 

Làm thế nào để cấu hình nginx để thêm một dấu gạch chéo? (Tôi nghĩ rằng tôi nên một quy tắc viết lại?)

+0

Um ... tại sao bạn muốn/ở lần cuối tất cả các URL của mình? – cletus

+0

Câu hỏi là gì? –

+0

Tôi cần nó cho một bộ sưu tập js. Nếu không có "/" nó tải lại trang web ... – Gomez

Trả lời

-3

Hãy thử điều này: ^(.*)$ http://domain.com/$1/ [L,R=301]

này chuyển hướng (Status đang 301) tất cả mọi thứ ($ 1) mà không có một "/" để "$ 1 /"

+0

Không có trạng thái 301. – Gomez

+0

Gomez: Bạn hoàn toàn cần 301 (chuyển hướng) URL không bị cắt giảm đến URL bị cắt, hoặc công cụ tìm kiếm và như vậy sẽ thấy example.com/blah và example.com/blah/ là hai hoàn toàn riêng biệt các trang – dbr

+0

Tôi vừa thử nghiệm điều này.^(. *) $ chuyển hướng mọi thứ bất kể. Tôi đã phải sử dụng^(. *) [^ /] Thay vào đó, vì vậy nó chỉ chuyển hướng nếu không có dấu gạch chéo kết thúc. – Chris

9

Đối với nginx:

rewrite ^(.*[^/])$ $1/ permanent; 
+0

Điều này sẽ thêm một dấu gạch chéo vào tất cả mọi thứ - vì vậy bạn sẽ kết thúc với index.php -> index.php /, và trang? A = b -> trang? A = b/nơi những gì OP chắc chắn muốn là trang? = b -> page /? a = b – Benubird

75

Nhiều khả năng tôi nghĩ rằng bạn sẽ muốn một cái gì đó như thế này:

rewrite ^([^.]*[^/])$ $1/ permanent; 

Các regu Biểu thức lar dịch thành: "viết lại tất cả các URI mà không có bất kỳ '.' trong đó không kết thúc bằng '/' với URI + '/' " Hoặc đơn giản: " Nếu URI không có dấu chấm và không kết thúc bằng dấu gạch chéo, hãy thêm dấu gạch chéo vào cuối "

Lý do chỉ ghi lại URI mà không có dấu chấm trong chúng khiến cho tệp đó có bất kỳ tệp nào có đuôi tệp không được viết lại. Ví dụ hình ảnh, css, javascript của bạn, vv và ngăn chặn khả năng chuyển hướng vòng nếu sử dụng một số khuôn khổ php mà không viết lại riêng của mình cũng

Một viết lại quen thuộc để đệm này sẽ là:

rewrite ^([^.]*)$ /index.php; 

này rất đơn giản ghi đè tất cả các URI không có dấu chấm trong chúng vào tệp index.php của bạn (hoặc bất kỳ tệp nào bạn sẽ thực thi trình điều khiển của mình).

+1

Đây là bài đăng duy nhất trên mạng nội bộ không thêm dấu gạch chéo vào mọi thứ. Cảm ơn vì đăng. – ansiart

+0

công cụ này hoạt động đáng tin cậy hơn nhiều, đặc biệt là với các khung công tác php có liên kết khá dễ viết – anthonysomerset

+0

Tôi có các tệp html tĩnh như vậy: ** http: //domain.com/about** lấy tên ** http: // domain .com/about.html ** nhưng vẫn hiển thị URL không có ".html". Tôi đang tìm cách thêm dấu gạch chéo sau khi tôi nhấn tệp nhưng nhận được 404 ngay bây giờ nếu tôi thêm dấu gạch chéo. Vì vậy, tôi muốn loại bỏ dấu gạch chéo (nếu tồn tại) và có hoặc không có dấu gạch chéo được "-html" tập tin nhưng cho thấy "/" sau.Điều này không hoạt động: '' viết lại ^/([a-zA-Z0-9] +) $ /$1.html; ghi lại^([^.] * [^ /]) $ 1 đô la/vĩnh viễn; '' Ngoài ra, hãy nhấp vào "about" trong menu severa lần tôi nhận được ** http: //domain.com/about/ này about/about/** etc .. – Asle

17
rewrite ^([^.\?]*[^/])$ $1/ permanent; 

để tránh truy vấn url còn lại nhận được/gắn thẻ.

ví dụ:

/myrest/do?d = 12345

+0

cách bạn có thể tạo kết quả '' ' /myrest/do /? D = 12345 ' '' –

1

sử dụng ghi đè từ anthonysomerset trong Wordpress, tôi đã thử nghiệm sự cố khi truy cập bảng điều khiển/wp-admin do vòng lặp chuyển hướng. Nhưng tôi giải quyết vấn đề này bằng cách sử dụng có điều kiện trên:

if ($request_uri !~ "^/wp-admin") 
{ 
rewrite ^([^.]*[^/])$ $1/ permanent; 
rewrite ^([^.]*)$ /index.php; 
} 
1
server { 
    # ... omissis ... 

    # put this before your locations 
    rewrite ^(/.*[^/])$ $1/ permanent; 

    # ... omissis ... 
} 

Nếu bạn muốn có một số loại yêu cầu (nói khác hơn GET những người thân) để được ngăn chặn từ làm điều này (thường đó là khoảng POST yêu cầu, như rewrite lượt bất kỳ phương thức yêu cầu thành GET, có thể phá vỡ một số chức năng động của trang web), thêm một if khoản:

server { 
    # ... omissis ... 

    # put this before your locations 
    if ($request_method = "GET") { 
     rewrite ^(/.*[^/])$ $1/ permanent; 
    } 

    # ... omissis ... 
} 

bạn cũng có thể đặt rewrite trong một khối location (if cũng vậy), để làm cho nó cụ thể hơn.

0

quá muộn nhưng tôi muốn chia sẻ giải pháp của mình, tôi đã gặp vấn đề với dấu gạch chéo và nginx.

#case : 
# 1. abc.com/xyz => abc.com/xyz/ 
# 2. abc.com/xyz/ => abc.com/xyz/ 
# 3. abc.com/xyz?123&how=towork => abc.com/xyz/?123&how=towork 
# 4. abc.com/xyz/?123&ho=towork => abc.com/xyz/?123&how=towork 

và đây là giải pháp của tôi

server { 
    .... 
    # check if request isn't static file 
    if ($request_filename !~* .(gif|html|jpe?g|png|json|ico|js|css|flv|swf|pdf|xml)$) { 
     rewrite (^[^?]+[^/?])([^/]*)$ $1/$2 permanent; 
    } 
    .... 
    location/{ 
    .... 
    } 
} 
0

Odd rằng đây là kết quả đầu tiên trong Google, nhưng không có một câu trả lời thỏa đáng. Có hai cách tốt để làm điều này tôi biết. Đầu tiên là kiểm tra thẳng nếu yêu cầu sẽ nhấn vào một tập tin và chỉ áp dụng điều kiện viết lại nếu không. Ví dụ.

server { 
    # ... 
    if (!-f $request_filename) { 
    rewrite [^/]$ $uri/ permanent; 
    } 
    location/{ 
     # CMS logic, e.g. try_files $uri $uri /index.php$request_uri; 
    } 
    # ... 
} 

Thứ hai, mà nhiều người thích vì họ muốn tránh bất kỳ sử dụng nếu đó không phải là 100% cần thiết, là sử dụng try_files để gửi yêu cầu đến một khối vị trí đặt tên khi nó đã giành' t nhấn một tập tin. Ví dụ.

server { 
    # ... 
    location/{ 
     try_files $uri $uri/ @cms; 
    } 
    location @cms { 
     rewrite [^/]$ $uri/ permanent; 
     # CMS logic, e.g. rewrite^/index.php$request_uri; 
    } 
    # ... 
} 
Các vấn đề liên quan