2010-03-08 43 views
24

Tôi đang cố gắng triển khai một trang web được tạo bằng Jekyll và muốn giữ trang web trong thư mục con riêng của mình trên máy chủ của tôi để giữ mọi thứ được sắp xếp hơn.Sử dụng thư mục con làm thư mục gốc với htaccess trong Apache 1.3

Về cơ bản, tôi muốn sử dụng nội dung của /jekyll làm gốc trừ khi tệp tương tự được đặt tên tồn tại trong gốc web thực tế. Vì vậy, một cái gì đó như /jekyll/sample-page/ sẽ hiển thị là http://www.example.com/sample-page/, trong khi một cái gì đó như /other-folder/ sẽ hiển thị là http://www.example.com/other-folder.

máy chủ thử nghiệm của tôi chạy Apache 2.2 và .htaccess sau (chuyển thể từ http://gist.github.com/97822) hoạt động hoàn hảo:

RewriteEngine On 

# Map http://www.example.com to /jekyll. 
RewriteRule ^$ /jekyll/ [L] 

# Map http://www.example.com/x to /jekyll/x unless there is a x in the web root. 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !^/jekyll/ 
RewriteRule ^(.*)$ /jekyll/$1 

# Add trailing slash to directories without them so DirectoryIndex works. 
# This does not expose the internal URL. 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_FILENAME} !/$ 
RewriteRule ^(.*)$ $1/ 

# Disable auto-adding slashes to directories without them, since this happens 
# after mod_rewrite and exposes the rewritten internal URL, e.g. turning 
# http://www.example.com/about into http://www.example.com/jekyll/about. 
DirectorySlash off 

Tuy nhiên, máy chủ sản xuất của tôi chạy Apache 1.3, mà không cho phép DirectorySlash. Nếu tôi tắt nó, máy chủ sẽ gặp lỗi 500 vì quá tải chuyển hướng nội bộ.

Nếu tôi nhận xét ra phần cuối của ReWriteConds và quy tắc:

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

... tất cả mọi thứ chủ yếu hoạt động: http://www.example.com/sample-page/ hiển thị các nội dung chính xác. Tuy nhiên, nếu tôi bỏ qua dấu gạch chéo theo sau, URL trong thanh địa chỉ sẽ hiển thị cấu trúc URL nội bộ thực sự: http://www.example.com/jekyll/sample-page/

Cách tốt nhất để giải thích cho các thư mục bị gạch ngang trong Apache 1.3, nơi các công cụ hữu ích như DirectorySlash không tồn tại ? Làm thế nào tôi có thể sử dụng thư mục /jekyll/ làm gốc trang mà không tiết lộ cấu trúc URL thực tế?

Edit:

Sau một tấn nghiên cứu Apache 1.3, tôi đã tìm thấy rằng vấn đề này về cơ bản là sự kết hợp của hai vấn đề khác nhau được liệt kê ở Apache 1.3 URL Rewriting Guide.

Tôi đã một (một phần) chuyển DocumentRoot, mà về mặt lý thuyết sẽ được đưa về chăm sóc với một cái gì đó như thế này:

RewriteRule ^/$ /e/www/ [R] 

Tôi cũng có "Trailing Vấn đề Slash," khét tiếng mà được giải quyết bằng cách thiết lập RewriteBase (như đã được đề xuất trong một trong các câu trả lời dưới đây):

RewriteBase /~quux/ 
RewriteRule ^foo$ foo/ [R] 

Sự cố là kết hợp cả hai. Di chuyển các tài liệu gốc không (? Không thể) sử dụng RewriteBase -fixing trailing slashes đòi hỏi nó ... Hmm ...

+0

điều này thật tuyệt vời. Nếu tôi có nhiều tên miền trỏ đến máy chủ, có cách nào để tôi có thể áp dụng các quy tắc trên theo cách có điều kiện không? do đó, nếu yêu cầu từ domainA.com sau đó phơi bày/domainA/thư mục con như thể nó đã được root .. và nếu yêu cầu từ domainB.com, sau đó phơi bày subdir/domainB/như thể nó là root? – bkwdesign

+0

@bkwdesign sử dụng nginx, nó đơn giản hơn nhiều cho loại chuyển hướng này. –

Trả lời

47

Cuối cùng, sau một tuần thử. RewriteRules thực sự là voodoo…

RewriteEngine On 

# Map http://www.example.com to /jekyll. 
RewriteRule ^$ /jekyll/ [L] 

# Map http://www.example.com/x to /jekyll/x unless there is a x in the web root. 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !^/jekyll/ 
RewriteRule ^(.*)$ /jekyll/$1 

# Add trailing slash to directories within jekyll 
# This does not expose the internal URL. 
RewriteCond %{SCRIPT_FILENAME} -d 
RewriteRule ^jekyll/(.*[^/])$ http://www.example.com/$1/ [R=301] 

Không cần DirectorySlash. Nó kỳ diệu tất cả các công trình.

+0

http://stackoverflow.com/a/9413539/3017716 – Ken

10

Bạn có thể chỉ cần sử dụng (?):

RewriteBase /jekyll 

Và mọi thứ bắt đầu từ thời điểm đó.

+0

Câu trả lời này tốt hơn !! – maxtorzito

+0

Cái này không hoạt động đối với tôi khi lưu trữ, câu trả lời ở trên. – Ray1618

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