2012-08-02 38 views
6

Tôi có các dự án công khai và riêng tư trên máy chủ web của mình. Tôi đặt tất cả những gì được công khai vào rootserver web, và tôi có một thư mục private mà tôi chỉ có thể tiếp cận từ mạng cục bộ (được thiết lập bởi .htaccess trong đó).Quy tắc ghi đè Apache để chuyển hướng tất cả yêu cầu đến thư mục con chứa các quy tắc khác .htaccess và viết lại

Tôi chỉ muốn đặt mọi dự án riêng tư trong thư mục private và xử lý yêu cầu tự động, nhưng muốn URL giống như chúng được phân phát từ webroot.
Ví dụ: nếu có private/project1 Tôi muốn sử dụng URL http://example.com/project1 để phân phối thư mục đó và không muốn thay đổi URL.

viết lại này rất đơn giản:

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ private/$1   

công trình, nhưng khi tôi có một private/project2 với một .htaccess:

Options +FollowSymLinks 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase /project2/ 

<Files .*> 
     Order Deny,Allow 
     Deny From All 
</Files> 

# Allow asset folders through 
RewriteRule ^(assets/.+) - [L] 

# Protect files from being viewed 
RewriteRule ^(uploads.+) - [F,L] 


RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

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

</IfModule> 
Options -Indexes 

thì nội dung tĩnh sẽ xuất hiện, nhưng các liên kết bị phá vỡ. Tôi nên sửa đổi gì để hoạt động?

Ngoài ra nếu tôi có một private/project3 và duyệt đến http://example.com/project3/ không có vấn đề, nhưng khi tôi duyệt đến http://example.com/project3 (không có dấu /) URL sẽ được hiển thị như http://example.com/private/project3/ trong trình duyệt. Tại sao ? Làm thế nào tôi có thể tránh điều đó?

+1

Chỉ cần thay đổi tài liệu HTTP của bạnRoot vào thư mục con. – Geoffrey

+0

quá trình này đã kết thúc. nhưng làm cách nào tôi có thể phục vụ các dự án công cộng? Một thư mục 'private' đơn giản? Một công cụ' Alias ​​/ publicproject1/home/www/publicproject1' đơn giản dành cho một số người, nhưng tôi có ứng dụng Hành khách (redmine) mà dường như không hoạt động với Bí danh – kissgyorgy

Trả lời

4

Tất cả những gì bạn cần trong trường hợp của mình là mod_alias.

Sau đó phục vụ dự án cá nhân của bạn như:

Alias /project3 /apache/htdocs/private/project3 

Và với .htaccess bạn sẽ kiểm soát quyền truy cập.

Nếu bạn muốn kiểm soát nó mà không cần khởi động lại máy chủ, bạn có thể cố gắng để đạt được điều này với sau cấu hình, có thể được đặt trong tập tin .htaccess:

RewriteRule ^/(project1)$ /private/$1/index.html 
RewriteRule ^/(project1/)(.*)$ /private/$1$2 

index.html - bất kỳ tập tin chỉ mục cho dự án của bạn . Cách công khai của URL này sẽ hoàn toàn có thể truy cập được, bên cạnh đường dẫn bạn đang sử dụng cho các dự án riêng tư. Bạn cũng có thể thêm RewriteCond để kiểm tra IP và chỉ cho phép viết lại cho mạng cục bộ của bạn.

+0

Tôi có một tấn Làm thế nào tôi có thể tránh viết một bí danh mới cho apache.conf và khởi động lại máy chủ mỗi khi tôi thêm một thư mục mới? – kissgyorgy

2

Thực ra, xem qua câu hỏi của bạn có vẻ như đây là vấn đề với mod_dir can thiệp vào đường dẫn đường dẫn. Cụ thể, DirectorySlash được bật theo mặc định, 301 sẽ chuyển hướng trình duyệt khi trình duyệt cho rằng trình duyệt đang yêu cầu thư mục và thiếu dấu gạch chéo. Bạn có thể thử quay DirectorySlash Off nhưng có một số security warning associated with it:

Tắt chuyển hướng dấu gạch chéo có thể dẫn đến tiết lộ thông tin. Hãy xem xét một tình huống mà mod_autoindex đang hoạt động (Tùy chọn + Chỉ mục) và 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 một 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ó thể hoặc không thể áp dụng cho thiết lập của bạn.Bạn cũng có thể thử thay đổi quy tắc viết lại của bạn để giải thích cho một gạch chéo:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)/$ private/$1/  

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

Nhưng tôi đã có kết quả khác nhau cố gắng để có mod_rewrite và mod_dir luôn chơi độc đáo với nhau.

+0

"Yêu cầu vượt quá giới hạn 10 chuyển hướng nội bộ do lỗi cấu hình có thể xảy ra Sử dụng 'LimitInternalRecursion' để tăng giới hạn nếu cần thiết. Sử dụng 'LogLevel debug' để có được một backtrace. " nhưng tôi cảm thấy giải pháp của bạn là thực sự gần gũi. Bất kỳ ý tưởng hơn? – kissgyorgy

+0

@Walkman lạ rằng nó sẽ nói rằng nếu các nguồn lực yêu cầu Nhưng tôi đoán bạn có thể thử thêm một 'RewriteCond% {REQUEST_URI}! ^/private /' ngay trước mỗi 'RewriteRule'. –

+0

bây giờ gốc không được phục vụ đúng cách. Tôi từ bỏ – kissgyorgy

2

Tên miền ảo có đủ không?

Bạn có thể sử dụng miền cho các dự án riêng tư và một dự án khác cho các dự án công khai.

http://httpd.apache.org/docs/2.2/vhosts/examples.html

+1

MAN! Điều này đánh dấu như vậy đúng. Tôi đã có một Virtualhost khác, tại sao tôi không nghĩ đến điều này? Tôi vừa tạo 'dev.example.com', nó là một DocumentRoot khác nên không cần phải trộn RewriteRules. Cám ơn rất nhiều ! Một giấc mơ trở thành sự thật: D Tôi đã đấu tranh với điều này trong nhiều tháng ... – kissgyorgy

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