2011-07-20 41 views
12

Tôi đang làm việc trên một ứng dụng sử dụng ghi đè url và có cấu hình .htaccess cụ thể. Khi làm việc trên các ứng dụng tôi có ba eviorments:.htaccess giữa developemt, dàn dựng và sản xuất

  1. Developent trên máy tính địa phương của tôi (localhost)
  2. Staging (staging.mydomain.com)
  3. sản xuất (www.mydomain.com)

Tôi liên tục đẩy nâng cấp mới lên môi trường dàn dựng và sản xuất và mỗi khi tôi ghi đè mã nguồn hiện tại, tôi phải thay đổi tệp .htaccess. Có cách nào tôi có thể .htaccess chung vào thư mục hoặc có nó tự động phát hiện môi trường của nó?

Tệp .htaccess hiện tại của tôi ở bên dưới. Tôi chỉ không nhận xét các phần giữa các môi trường khác nhau nhưng rất thích dừng việc đó ...

# Development 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 

# RewriteEngine on 
# RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteCond %{REQUEST_FILENAME} !-d 
# RewriteCond %{REQUEST_URI} !=/favicon.ico 
# RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 

# RewriteEngine on 
# RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteCond %{REQUEST_FILENAME} !-d 
# RewriteCond %{REQUEST_URI} !=/favicon.ico 
# RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 

Cảm ơn bạn trước!

Chuck

+0

Tại sao các đường dẫn khác nhau, nhưng /favicon.ico là giống nhau không? –

+2

Tôi chỉ cần thiết lập máy chủ ảo để bạn có cùng URL trong mỗi môi trường. Sau đó, bạn sẽ không cần phải thay đổi .htaccess giữa chúng. – Quentin

Trả lời

13
# Development 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^localhost 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^staging.mydomain.com 
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^www.mydomain.com 
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 
+0

Có phải '% {REQUEST_HOST}' biến lỗi thời?Tôi chỉ tìm thấy tương đương '% {HTTP_HOST}' trong tài liệu mod_rewrite. –

+0

@JohnnyWong, vâng, có vẻ như vậy: https://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond đã cập nhật câu trả lời bằng 'HTTP_HOST' var. Hãy thoải mái chỉnh sửa câu trả lời trong trường hợp bạn tìm thấy bất kỳ vấn đề nào khác vì tôi không sử dụng apache kể từ năm 2011;) –

7

Một lựa chọn sẽ được biến môi trường thiết lập trong httpd.conf (hoặc nơi khác) mà xác định môi trường của bạn.

Ví dụ (trong httpd.conf):

SetEnv ENVIRONMENT production 

(trong .htaccess)

RewriteEngine on 

# Development 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = development 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = staging 
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = production 
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 

chưa được kiểm tra, nhưng tôi nghĩ rằng khái niệm này là đủ âm thanh để tìm ra bất kỳ vấn đề ;-)

+0

+1 Tuyệt vời nếu bạn có quyền truy cập vào Apache conf bởi vì bạn có thể thiết lập môi trường bất kể URL là. Làm cho phát triển địa phương nơi bạn sử dụng một URL khác nhau để lưu trữ trên máy chủ dễ dàng hơn nhiều – Precastic

0

Chuck D, biến thể của Dumitru Ceban rất tốt. Nhưng tôi khuyên bạn nên thử tùy chọn để có một số cờ trong mã của bạn - không phải trong .htacces.

Ngoài ra, đề xuất tốt về rudi_visser. Nhưng tôi muốn thêm vào đây, trong hệ thống lý tưởng, chúng ta chỉ nên sử dụng apache`s * .conf và từ chối .htaccess (chỉ là một hiệu năng ngu ngốc).

Vì vậy, tôi khuyên bạn nên có một số cờ trong mã, tránh .htacess (nếu bạn có thể) và chuyển đổi env. bởi giá trị conf đơn giản hoặc theo một số logic như if locaslhost == host then ...

+0

Hoặc đối với hệ thống lý tưởng, chúng tôi chỉ có thể sử dụng - *. – gaRex

+0

Tôi không nghĩ rằng hiệu suất của .htaccess trên các hệ thống hiện đại là bất cứ điều gì phải lo lắng nữa! Nhưng dù sao tôi không nghĩ rằng việc đưa logic này vào mã sẽ giúp đỡ trong tình huống này do thực tế là Apache sẽ không biết nơi nào để định tuyến các yêu cầu. –

+0

@rudi_visser, không chắc chắn, rằng .htaccess là đủ về sản xuất. Và PHP có thể biết nơi để vượt qua logic nào bên trong khuôn khổ của bạn: kết nối DB nào của tmp/pathes để sử dụng. – gaRex

1

Bạn có thể không chỉ đặt các tệp .htaccess trên mỗi môi trường và sau đó chỉ bỏ qua tệp trong bất kỳ chương trình FTP nào hoặc triển khai bạn đang sử dụng?

Cách khác, những gì tôi làm được thiết lập VirtualHosts trong máy chủ lưu trữ cục bộ giống với miền sản xuất, nhưng với tiền tố dev.. Ví dụ: www.example.comdev.example.com. Bằng cách đó, tôi luôn có thể chắc chắn rằng thư mục gốc là thư mục cấp cao nhất của bất kỳ máy chủ nào tôi đang sử dụng, bất kể môi trường; và tôi không cần phải viết lại các chỉ thị .htaccess của mình.

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