Có vấn đề gì trong các quy tắc thứ tự được đặt trong htaccess?


9

Tôi hy vọng đây là câu trả lời CÓ hoặc KHÔNG đơn giản (vui lòng nêu rõ lý do)

Câu 1: Có vấn đề gì theo thứ tự các quy tắc được đặt trong htaccess không? Vì chúng là các mục hoàn toàn tách biệt: ví dụ:

Q2: Nếu có, tôi có đang áp dụng đúng thứ tự không? để tăng tốc động cơ htacces và không làm quá tải nó với các quy tắc không cần thiết?

Câu 3: bất kỳ lời khuyên nào về việc tắt / thêm ở đây đều được chào đón +1!


# DirectoryIndex index.php /index.php
AddDefaultCharset UTF-8
RewriteEngine on
# Options All
# Options +FollowSymLinks
# Options +FollowSymLinks -Indexes -ExecCGI
# RewriteBase /

#####################################################

<IfModule mod_headers.c>
    ExpiresActive On
    ExpiresDefault M172800
    Header unset ETag
    FileETag None
    Header unset Pragma

    ##### STATIC FILES
    <FilesMatch "\\.(ico|jpg|png|gif|svg|swf|css|js|fon|ttf|eot|xml|pdf|flv)$">
        ExpiresDefault M1209600
        Header set Cache-Control "public, max-age=1209600"
    </FilesMatch>

    ##### DYNAMIC PAGES
    <FilesMatch "\\.(php)$">
        ExpiresDefault M604800
        Header set Cache-Control "public, max-age=604800"
    </FilesMatch>
</IfModule>

#####################################################

#  /page123 and /page123/ will all go to /page123.php
RewriteRule ^(.+)/$  /$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

####################################################

# NO WWW   http://www. becomes always http://
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

##############################################################
# add own extensions that will be interpreted as php
AddType application/x-httpd-php .php
AddType image/svg+xml svg svgz
AddType text/css css
AddType text/javascript js
AddEncoding gzip svgz

##############################################################

ErrorDocument 500 /
ErrorDocument 404 /

Câu trả lời:


10

Chà, các tệp .htaccess sử dụng cùng định dạng với tệp cấu hình Apache thông thường, do đó các quy tắc tương tự được áp dụng.

Hầu hết các cài đặt cấu hình không phụ thuộc vào thứ tự, nhưng một số cài đặt - phụ thuộc vào cài đặt.

RewriteRuleRewriteCondví dụ nhạy cảm với thứ tự, vì vậy trong trường hợp đó, câu trả lời là CÓ.

Xem ví dụ

http://wiki.apache.org/httpd/RewriteRule

cho một lời giải thích về thứ tự mà chúng được đánh giá.


4

Nó không thành vấn đề. Trích dẫn từ tài liệu cho RewriteRule :

Thứ tự mà các quy tắc này được xác định là quan trọng - đây là thứ tự mà chúng sẽ được áp dụng vào thời gian chạy.


1
Trong mod_rewrite, nó quan trọng - có. Tuy nhiên, OP không đề cập cụ thể đến mod_rewrite và có nhiều chỉ thị khác từ các mô-đun khác trong .htaccesstệp của OP . Nói tóm lại, các lệnh từ các mô-đun khác nhau (và trong các thùng chứa khác nhau ) thực hiện độc lập và theo thứ tự được xác định trước, bất kể thứ tự rõ ràng của chúng trong tệp cấu hình.
MrWhite

1

Tôi không thể nói về cách thứ tự <files>vs <Rewrite>, ví dụ, ảnh hưởng đến hiệu suất. Tôi đang cố gắng để tìm ra điều đó bản thân mình. Tôi đã không thể tìm thấy bất kỳ thông tin nào về việc này, vì vậy có lẽ nó không thành vấn đề ??

Tuy nhiên, tôi muốn chỉ ra rằng giữa Rewritevs Redirect(và RedirectMatch), thứ tự thực hiện có thể không theo thứ tự trong danh sách, mặc dù đó là những gì mọi người thường có thể mong đợi ..
Cụ thể, mod_rewritemod_aliascác module được xử lý / thực hiện independantly, và trong mệnh lệnh đó

  1. Tất cả các lệnh mod_rewrite ( Rewrite) được thực thi (theo thứ tự chúng được liệt kê).
  2. THEN tất cả các chỉ thị mod_alias ( RedirectRedirectMatch) được thực hiện theo thứ tự chúng được liệt kê trong tệp.

Vì vậy, ngay cả khi Redirecttiền thu được a Rewrite, Redirect sẽ chỉ được xử lý sau khi tất cả các Phần thưởng đã được xử lý.

Một cách để giữ cho tệp "có thể đọc được" nếu bạn có cả chuyển hướng và viết lại, là hoàn toàn không sử dụng mod_aliasmô-đun. Thay vào đó, chỉ sử dụng mod_rewrite. Viết lại bằng cờ [R] về cơ bản biến nó thành viết lại.
Câu trả lời của quản trị trang web này cho thấy làm thế nào.

Bây giờ, tất cả các lệnh sẽ được thực hiện theo thứ tự chúng xuất hiện trong tệp, do đó không có bất ngờ khó chịu, hoặc nhầm lẫn về thứ tự thực hiện. Ngoài ra, bạn có thể thể chất di chuyển tất cả các RedirectRedirectMatchchỉ thị để "đáy" của tập tin, như vậy là để nhắc nhở bản thân rằng họ sẽ không được thực hiện cho đến sau khi Rewrites anyway.

Dưới đây là một số câu trả lời StackExchange tốt đã khai sáng cho đến thời điểm này:

Đối với phần còn lại, tôi không thể tìm thấy bất kỳ thông tin nào về hiệu suất giữa việc đặt filestrước hoặc sau rewrites, chẳng hạn. Lời khuyên duy nhất dựa trên hiệu suất mà tôi tìm thấy là nếu ai đó có quyền truy cập vào tệp cấu hình máy chủ thì tốt nhất nên chuyển càng nhiều càng tốt từ tệp .htaccess sang tệp cấu hình và vô hiệu hóa hoàn toàn các tệp .htaccess (hoặc chỉ định các thư mục cụ thể trong đó tập tin .htaccess nên được đọc).

Logic có các quy tắc được đặt trong tệp cấu hình chỉ cần được đọc một lần. Nếu xử lý htaccess được bật, thì đối với mọi yêu cầu, mọi thư mục của máy chủ (tại hoặc cao hơn thư mục được yêu cầu) phải được tìm kiếm các tệp htaccess có thể, cho dù chúng có tồn tại hay không. Và nếu họ làm, mọi người phải được đọc lại.


-1

Tôi có cùng mối quan tâm được đăng nhưng đây là phối cảnh trang web quản trị máy chủ cho phép họ khởi động lại apache sau khi thay đổi cấu hình máy chủ apache.

Cho đến nay, phản hồi tốt nhất tôi nhận được là liệt kê các chỉ thị liên quan đến Tệp trước tiên.

Điều này có ý nghĩa liên quan đến nhu cầu của apache để quản lý các thư mục và hướng dẫn htaccess trong mỗi thư mục.

Vì vậy, hãy liệt kê các lệnh liên quan đến tệp trước, sau đó các khối rõ ràng để kết thúc quá trình apaccess apache theo thứ tự hiển nhiên.

Giải pháp khả thi để tối ưu hóa các yêu cầu: - sửa lỗi liên quan đến url yêu cầu - Hạn chế liên quan đến thư mục - Hạn chế liên quan đến chỉ mục - hạn chế liên quan đến tệp - hạn chế proxy <- kill all - tác nhân người dùng trống <- giết tất cả ... danh sách là niềm vui bất tận

Mối quan tâm của tôi liên quan đến chuỗi chỉ thị. Chẳng hạn, tôi có nên đặt các chỉ mục Index, tệp và Tiêu đề trước RewriteConds không?


chú thích: Thay thế mẫu RewriteRule [flags] Không trả lời câu hỏi xử lý ứng dụng rõ ràng này!
Testbench
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.