2013-09-04 27 views
10

Tôi có cấu trúc này: site.com/api/index.php. Khi tôi gửi dữ liệu đến site.com/api/ không có vấn đề gì, nhưng tôi tưởng tượng nó sẽ tốt hơn nếu api sẽ hoạt động mà không có dấu gạch chéo, cũng như sau: site.com/api. Điều này gây ra chuyển hướng 301 và do đó mất dữ liệu (vì dữ liệu không được chuyển tiếp). Tôi đã thử mọi lần viết lại tôi có thể nghĩ đến và không thể tránh được sự chuyển hướng. Đây là quy tắc viết lại hiện tại của tôi (mặc dù nó có thể không liên quan).Cách truy cập index.php của thư mục mà không có dấu gạch chéo và KHÔNG chuyển hướng 301

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^api/(.*)$ api/index.php [L] 

Tôi có thể làm cho url này hoạt động và duy trì dữ liệu bài đăng mà không sử dụng dấu gạch chéo không?

Một số viết lại mà không làm việc: (tất cả vẫn redirect)

RewriteRule ^api$ api/index.php [L] 
RewriteRule ^api/*$ api/index.php [L] 
+0

Dấu gạch chéo sau được thêm bởi mô-đun apache mod_dir: http://httpd.apache.org/docs/2.2/mod/mod_dir.html –

+0

Ngoài ra, quy tắc viết lại của bạn, theo cách được viết, có dấu gạch chéo theo sau là một phần của quy tắc. Có lẽ bạn chỉ cần xóa '/' khỏi quy tắc và nó sẽ hoạt động. –

+0

Phải. Tôi đã nghĩ rằng tôi có thể viết lại một yêu cầu đến thư mục đó ngay tới index.php để mô-đun không bao giờ khởi động, nhưng nó không hoạt động. Tôi sẽ cập nhật để hiển thị những gì tôi đã thử ở đó. – m59

Trả lời

11

Trước tiên, bạn sẽ cần phải tắt thư mục dấu gạch chéo, nhưng có một lý do tại sao nó là rất quan trọng là có một dấu gạch chéo:

Mod_dir docs:

tắt dấu gạch chéo redirect trailing có thể dẫn đến một công bố thông tin. Hãy xem xét một tình huống mà mod_autoindex đang hoạt động (Options +Indexes)DirectoryIndex được đặt thành tài nguyên hợp lệ (ví dụ: index.html) và không có trình xử lý đặc biệt nào khác được xác định cho URL đó. Trong trường hợp này, yêu cầu có dấu gạch chéo sẽ hiển thị tệp index.html. Nhưng yêu cầu không có dấu gạch chéo sẽ liệt kê nội dung thư mục.

Điều đó có nghĩa là truy cập thư mục không có dấu gạch chéo sẽ liệt kê nội dung thư mục thay vì phục vụ chỉ mục mặc định (ví dụ: index.php). Vì vậy, nếu bạn muốn chuyển thư mục cắt giảm hết, bạn phải chắc chắn để nội viết lại Trailing Slash trở lại trong.

DirectorySlash Off 

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*[^/])$ /$1/ 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^api/(.*)$ api/index.php [L] 

Nguyên tắc đầu tiên đảm bảo rằng các dấu gạch chéo được gắn vào phía sau, mặc dù chỉ trong nội bộ. Không giống như mod_dir, mà chuyển hướng bên ngoài trình duyệt, viết lại nội bộ là vô hình cho trình duyệt. Quy tắc tiếp theo sau đó thực hiện định tuyến api, và vì quy tắc đầu tiên, có đảm bảo là dấu gạch chéo.

+0

Đây có phải là cách duy nhất để tránh chuyển hướng trong khi mô-đun được bật không? – m59

+0

Ngoài ra, thông thường các máy chủ dùng chung có cho phép thay đổi này hay không? Tôi đã thấy họ nghiêm khắc về những thứ như thế. – m59

+1

@ m59 Không có cách nào để tránh chuyển hướng trong khi thư mục 'DirectorySlash' của mod_dir được bật. Bạn có thể tránh chuyển hướng bằng cách tắt nó đi, nhưng mod_dir xử lý URI trước khi mod_rewrite làm (hầu như luôn luôn) để không có cách nào xung quanh nó. Bây giờ tôi không biết dịch vụ lưu trữ nghiêm ngặt như thế nào về điều này. Nhưng 'DirectorySlash' là một phần của ghi đè" Chỉ mục ", vì vậy rất có thể họ cho phép điều đó. –

0

Nếu bạn không muốn sử dụng giải pháp do Jon Lin cung cấp (định cấu hình lại tất cả URL trỏ đến thư mục), bạn có thể sử dụng đoạn mã sau (lưu ý? Trong regexp - về cơ bản là dấu gạch chéo sau " api "là tùy chọn). Tôi chưa thử nghiệm, nhưng nó phải hoạt động như sau:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^api/?(.*)$ api/index.php [L] 
+0

Tôi đã thử chính xác điều đó. Các dấu gạch chéo tùy chọn không giúp đỡ, cũng không loại bỏ các dấu gạch chéo hoàn toàn để chắc chắn. – m59

+0

Tôi khá chắc chắn rằng nó không hoạt động vì mô-đun bắt đầu và chuyển hướng trước khi viết lại có cơ hội khắc phục. – m59

+0

@ m59 Tôi nghĩ lý do bạn được chuyển hướng sau đó là do trình duyệt của bạn đã lưu trong bộ nhớ cache phản hồi 301, vì vậy nó tự động được chuyển hướng đến URL có dấu gạch chéo. Bạn nên kiểm tra trong curl hoặc một trình duyệt mới –

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