2010-06-28 42 views
10

Tôi đang sử dụng tệp .htaccess để yêu cầu trực tiếp thư mục tới tệp php tùy chỉnh cung cấp thông tin về thư mục đó (và tôi muốn url hiển thị bởi trình duyệt không thay đổi).mod_rewrite: thêm dấu gạch chéo sau?

Đây là phần liên quan của tệp .htaccess.

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L] 

này hoạt động tốt nếu bạn đi vào một thư mục và bao gồm một dấu gạch chéo:

http://domain.com/path/ 

Nhưng mà không có dấu gạch chéo, nó không

http://domain.com/path 

không Url (hiển thị trong trình duyệt) biến thành:

http://localhost:8888/path/?url=/path 

Tôi đã thử khắc phục điều này bằng cách thêm quy tắc trên quy tắc này:

RewriteCond %{REQUEST_FILENAME} -D 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [L] 

Nhưng điều đó không hiệu quả đối với tôi.

Làm cách nào để có được .htaccess để thêm dấu gạch chéo sau nếu bỏ qua và sau đó hành động giống như nó đã ở đó?

Cảm ơn bạn

Cập nhật: Theo yêu cầu, đây là toàn bộ sự việc.

<IfModule mod_rewrite.c> 
RewriteEngine On 

#force trailing slashes on real directories 
RewriteCond %{REQUEST_FILENAME} -D 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [L] 

#use the directory viewer on directories without an index page 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L] 

</IfModule> 
+0

Dựa vào những gì bạn đang mô tả tôi nghĩ rằng có điều gì đó sai trái với một phần khác của tệp '.htaccess' của bạn, vì vậy bạn có nhớ đăng toàn bộ nội dung không? –

Trả lời

8

Thở dài.

dòng này:

RewriteCond %{REQUEST_FILENAME} -D 

nên đã:

RewriteCond %{REQUEST_FILENAME} -d 
0

Ý của bạn là

RewriteRule ^(.*)$ $1/ [L] 

để thay thế?

Tôi không biết về cách tiếp cận của bạn. Tôi sẽ cố gắng một cái gì đó giống như

RewriteRule ^/(\S+)/?$ /myphp.php?url=$1 

Tôi đã sử dụng này cho viết lại trước và nó hoạt động:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^domain\.com 
RewriteRule ^(.*)$ http://www.domain.com$1 
RewriteRule ^/(\S+)/?$ /myphp.php?url=$1 

Lưu ý rằng tôi đã không bao gồm các dấu gạch chéo trong quy tắc đầu tiên.

Ngoài ra, tôi khuyên bạn không nên dựa vào .htaccess trừ khi thực sự cần thiết. Điều này là do máy chủ sẽ kiểm tra các tệp .htaccess liên tục. Sử dụng tệp httpd.conf thay vào đó có nghĩa là apache sẽ chỉ tải các điều kiện và quy tắc một lần. Ít nhất tôi đã được khuyên làm như vậy vì điều này.

+0

Bạn nói đúng, đó phải là *, không phải là?. Đã sửa lỗi đó trên câu hỏi. Tôi đã thử sử dụng đề xuất của bạn, nhưng có cùng tác dụng. Để rõ ràng trong phiên bản trong câu hỏi của tôi và trong phiên bản, chuyển hướng sẽ đến đúng địa điểm. Vấn đề là văn bản được trình duyệt hiển thị. Tôi không muốn người dùng thấy chuỗi truy vấn. Tôi chỉ muốn họ nhìn thấy đường dẫn đến thư mục, với dấu gạch chéo. – bkit

+0

Bạn đã thử thêm mã chỉ trong tệp httpd.conf thay vì tệp .htaccess? Bạn có thể lưu nó vào một tệp httpd-extra.conf riêng biệt và sau đó sử dụng lệnh include ở cuối tệp httpd.conf của bạn. Tôi đã sử dụng mã này để đạt được chính xác những gì bạn muốn, để tôi có thể cung cấp thêm url thân thiện với người dùng. Dòng cuối cùng phải cung cấp: ghi đè (nội bộ)/path dưới dạng /myphp.php?url=path, vì vậy trình duyệt của bạn chỉ hiển thị đầu tiên. Hy vọng điều đó sẽ hữu ích. – misterte

0

Hãy thử điều này. Nó sẽ thêm dấu gạch chéo theo sau vào các yêu cầu thư mục không có dấu gạch chéo.

<IfModule mod_rewrite.c> 
RewriteEngine On 

#use the directory viewer on directories without an index page 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*?)/?$ /myphp.php?url=$1/ [QSA,L] 

</IfModule> 
4

Đừng bận tâm với Mod Rewrite, có một chỉ thị cho nó

<Location /some/path> 
    DirectorySlash On 
    SetHandler some-handler 
</Location> 

http://httpd.apache.org/docs/2.2/mod/mod_dir.html

+0

'DirectorySlash Off' làm ngược lại, nó vô hiệu hóa các dấu gạch chéo tự động mod_dir nối thêm khi tài nguyên yêu cầu là một thư mục. Mặc định đang bật. Tại sao không làm việc cho OP là không rõ, có lẽ mod_dir không được tải – higuita

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