2015-04-13 17 views
7

Tôi đang viết một CMS đơn giản bằng PHP. Trang (file markdown) và hình ảnh được truy cập như thế này (theo thứ tự):Các url sạch của Nginx, cách viết lại một thư mục làm đối số với try_files

example.org/?q=about.md 
example.org/?i=photo.jpg 

Tùy chọn, tôi muốn sử dụng các URL sạch với Nginx, để làm cho các yêu cầu tương tự như thế này:

example.org/about 
example.org/photo.jpg 

Tôi thích sử dụng try_files hơn ifrewrite nhưng sau khi thử nghiệm hàng giờ, tôi không thể làm cho nó hoạt động.

location/{ 
    try_files $uri $uri/ /?q=$uri.md =404; 
} 

location ~ \.(gif|jpg|png)$ { 
    try_files $uri /?i=$uri =404; 
} 

Tôi không hiểu tại sao mã trên không hoạt động (các url có đối số hoạt động tốt nhưng các trường hợp đẹp cho lỗi 404).

Có điều gì sai khi chuyển tên thư mục làm đối số sử dụng $uri?
Tôi có cần phải thoát khỏi một số nhân vật kỳ lạ (ngoài chủ nhà của tôi) không?


Để được triệt để, tôi đang chạy Nginx 1.6.2, sử dụng nginx.conf chuẩn. Dưới đây là phần còn lại của khối máy chủ của tôi:

server_name example.org; 
root /srv/example/; 
index index.html index.htm index.php; 

(...) 

location ~ \.php$ { 
    fastcgi_split_path_info ^(.+\.php)(/.+)$;  
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_index index.php; 
    include fastcgi.conf; 
} 

và fastcgi.conf cũng là tiêu chuẩn.

+0

Có phải 'document_root' được đặt chính xác không? Bạn có thể thử '/index.php? Q = $ uri.md' trong' try_files', nghĩa là khai báo 'index.php', mặc dù tôi nghĩ nó sẽ hoạt động như thế này. – Keelan

+0

Tôi khá chắc chắn 'document_root' là okay vì các url thông thường/dài hoạt động tốt. Tôi cũng đã thử với '/ index.php? Q = $ uri.md' nhưng nó không tạo ra sự khác biệt. – wilks

Trả lời

3

tôi đã có thể để có được ví dụ bạn để làm việc bằng cách đơn giản bỏ qua =404:

location/{ 
    try_files $uri $uri/ /?q=$uri.md; 
} 

location ~ \.(gif|jpg|png)$ { 
    try_files $uri /?i=$uri; 
} 

Trích dẫn the manual:

Kiểm tra sự tồn tại của tập tin trong trình tự quy định và sử dụng các tập tin tìm thấy đầu tiên để xử lý yêu cầu; [...] Nếu không tìm thấy tệp nào trong số, chuyển hướng nội bộ đến số uri được chỉ định trong tham số cuối cùng được thực hiện.

Bạn muốn điều đó chuyển hướng nội bộ, mà chỉ xảy ra nếu không ai trong số các tập tin được tìm thấy, nhưng =404 luôn được tìm thấy.

+0

Tuyệt vời, nó hoạt động hoàn hảo ngay bây giờ! Và đọc lại câu trả lời của bạn, tôi thậm chí còn hiểu được logic đằng sau nó. Cảm ơn – wilks

Các vấn đề liên quan