Tôi nên sử dụng lệnh <If> trong .htaccess như thế nào?


16

Tôi đang cố gắng thêm một câu lệnh có điều kiện bằng cách sử dụng lệnh If của Apache trong tệp .htaccess của tôi.

Tôi đã tham khảo trang này http://httpd.apache.org/docs/trunk/mod/core.html#if nhưng nó không giải thích nhiều / đưa ra nhiều ví dụ. Hai ví dụ không đầy đủ mà nó đưa ra là:

<Nếu% {REQUEST_METHOD} IN, ĐẦU, TÙY CHỌN> 

<Nếu "$ req {Máy chủ} = ''"> 

Vì vậy, tôi đã cố gắng thêm nó vào tệp .htaccess của mình:

<Nếu% {SERVER_PORT} VÀO, ĐẦU, TÙY CHỌN>
   # ở đây chưa
</ Nếu>

Nhưng tôi vẫn nhận được Lỗi 500 khi tôi thử và tải trang. Đây là cài đặt cục bộ của tôi và nó đã hoạt động tốt trước đó (hoặc nếu tôi loại bỏ mã đó). Tôi tin rằng tôi đã AllowOverride Allthiết lập toàn cầu và bối cảnh cho lệnh If sẽ cho phép nó hiện diện trong .htaccess ("Ngữ cảnh: cấu hình máy chủ, máy chủ ảo, thư mục, .htaccess").

Ai đó có thể cho tôi một số ví dụ về cách sử dụng đúng lệnh <If> hoặc một số hướng dẫn về lý do tại sao nó không hiệu quả với tôi không?

Cảm ơn!


1
Nếu bạn gặp lỗi 500, điều đó có nghĩa là Apache đã ghi lại một cái gì đó vào nhật ký lỗi của bạn. Nó nói gì? Ngoài ra, thử nghiệm của bạn cho SERVER_PORTGET,HEAD,OPTIONSkhông làm cho bất kỳ ý nghĩa ( SERVER_PORTsẽ là số cổng số trên mà yêu cầu được nhận).
larsks

Cảm ơn, larsks. Có vẻ như tôi đang chạy apache 2.0 không hỗ trợ lệnh <If>. Có lẽ tôi cần xem xét nâng cấp lên 2.3. Ít nhất điều này giải thích tại sao không có ví dụ ở bất cứ đâu (b / c tính năng này rất mới). Cảm ơn vì lời khuyên.
cwd

Câu trả lời:



14

<If> chỉ có sẵn trong Apache 2.4+, vì vậy trước tiên hãy đảm bảo rằng bạn có phiên bản đó.

Ví dụ

# Compare the host name to example.com and redirect to www.example.com if it matches
<If "%{HTTP_HOST} == 'example.com'">
  Redirect permanent "/" "http://www.example.com/"
</If>

<If "%{HTTP_HOST} =~ /regex/">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

<If "%{REQUEST_URI} =~ m#/regex/including/slashes/#">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

Các lựa chọn thay thế cho <If>

Có một vài giải pháp khác để thực hiện các câu lệnh có điều kiện trong Apache 2.2 nếu bạn vẫn bị mắc kẹt với điều đó.

  • Bạn có thể đặt các biến môi trường thông qua:

    • Cấu hình Apache
    • SetEnvIf
    • mod_rewrite RewriteMatch
  • Sau đó, bạn có thể thực hiện các câu điều kiện bằng cách sử dụng

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

Thí dụ:

# Set environment variable if we're on staging site
SetEnvIf Host staging ROBOTS_NOINDEX

# Set environment variable if we're within a specific folder
SetEnvIf Request_URI ^/app/webroot/files/ ROBOTS_NOINDEX

# Send custom header if environment variable is set
Header set X-Robots-Tag "noindex" ENV=ROBOTS_NOINDEX

1
Kiểm tra nhưng không hoạt động! trong tài liệu từ apache, <IfDefine>chỉ thị phân tích cú pháp khi khởi động và parameter-namechỉ có thể chuyển qua dấu nhắc lệnh bằng cách sử dụnghttpd -Dx=y
William Leung

"Lựa chọn thay thế nếu" của bạn hoạt động tốt với tôi, ví dụ hay.
Kyborek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.