Mẹo để gỡ lỗi .htaccess viết lại quy tắc


272

Nhiều người đăng có vấn đề gỡ lỗi các câu lệnh RewriteRule và RewriteCond trong .htaccesstệp của họ . Hầu hết trong số này đang sử dụng dịch vụ lưu trữ chia sẻ và do đó không có quyền truy cập vào cấu hình máy chủ gốc. Họ không thể tránh sử dụng .htaccesscác tệp để viết lại và không thể kích hoạt RewriteLogLevel "như nhiều người trả lời đề xuất. Ngoài ra, có nhiều .htaccesscạm bẫy và hạn chế cụ thể không được bảo vệ tốt. .

Vì vậy, câu hỏi của tôi ở đây là làm thế nào chúng tôi khuyên họ nên tự gỡ lỗi các quy tắc của mình . Tôi cung cấp một vài gợi ý dưới đây. Các đề xuất khác sẽ được đánh giá cao.

  1. Hiểu rằng công cụ mod_rewrite quay vòng qua .htaccesscác tệp . Động cơ chạy vòng lặp này:

    do
      execute server and vhost rewrites (in the Apache Virtual Host Config)
      find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled
      if found(.htaccess)
         execute .htaccess rewrites (in the user's directory)
    while rewrite occurred
    

    Vì vậy, các quy tắc của bạn sẽ được thực thi nhiều lần và nếu bạn thay đổi đường dẫn URI thì nó có thể sẽ thực thi các .htaccesstệp khác nếu chúng tồn tại. Vì vậy, hãy chắc chắn rằng bạn chấm dứt vòng lặp này, nếu cần bằng cách thêm RewriteCondvào để dừng quy tắc bắn. Đồng thời xóa mọi .htaccessquy tắc viết lại cấp thấp hơn trừ khi có ý định rõ ràng sử dụng quy tắc đa cấp.

  2. Đảm bảo rằng cú pháp của mỗi Regapi là chính xác bằng cách kiểm tra một tập các mẫu thử nghiệm để đảm bảo rằng đó là một cú pháp hợp lệ và thực hiện những gì bạn dự định với một phạm vi URI thử nghiệm đầy đủ. Xem câu trả lời dưới đây để biết thêm chi tiết.

  3. Xây dựng quy tắc của bạn tăng dần trong một thư mục thử nghiệm. Bạn có thể sử dụng "thực thi .htaccesstệp sâu nhất trên tính năng đường dẫn" để thiết lập một thư mục thử nghiệm riêng biệt (cây) và gỡ lỗi các quy tắc ở đây mà không làm hỏng các quy tắc chính của bạn và ngăn trang web của bạn hoạt động. Bạn phải thêm từng cái một vì đây là cách duy nhất để bản địa hóa các thất bại theo các quy tắc riêng lẻ.

  4. Sử dụng một đoạn mã giả để loại bỏ các biến môi trường và máy chủ . (Xem Liệt kê 2 ) Nếu ứng dụng của bạn sử dụng, giả sử, blog/index.phpsau đó bạn có thể sao chép ứng dụng này vào test/blog/index.phpvà sử dụng nó để kiểm tra các quy tắc blog của bạn trong testthư mục con. Bạn cũng có thể sử dụng các biến môi trường để đảm bảo rằng công cụ viết lại trong việc diễn giải các chuỗi thay thế một cách chính xác, vd

    RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
    

    và tìm kiếm các biến REDIRECT_ * này trong kết xuất phpinfo. BTW, tôi đã sử dụng cái này và phát hiện ra trên trang web của mình rằng tôi phải sử dụng %{ENV:DOCUMENT_ROOT_REAL}thay thế. Trong trường hợp các vòng lặp chuyển hướng REDIRECT_REDIRECT_ * liệt kê các biến trước đó. Vân vân..

  5. Đảm bảo rằng bạn không bị cắn bởi bộ nhớ cache trình duyệt 301 không chính xác . Xem câu trả lời dưới đây . Tôi cảm ơn Ulrich Palha vì điều này.

  6. Công cụ viết lại có vẻ nhạy cảm với các quy tắc xếp tầng trong một .htaccessngữ cảnh, (đó là RewriteRulekết quả của một sự thay thế và điều này rơi vào các quy tắc tiếp theo), vì tôi đã tìm thấy các lỗi với các yêu cầu phụ nội bộ (1) và xử lý PATH_INFO không chính xác thường có thể xảy ra được ngăn chặn bằng cách sử dụng các cờ [NS], [L] và [PT].

Bất kỳ bình luận hoặc đề nghị thêm?

Liệt kê 1 - phpinfo

<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);

10
Đây là tốt ... Có lẽ bạn nên chuyển chúng từ câu hỏi thành một câu trả lời.
w00t

@ w00t, tôi đã tách trình kiểm tra regrec theo đề xuất của bạn vì tôi muốn giới thiệu nó theo liên kết trong các câu trả lời khác.
TerryE

3
Bạn có thể muốn thêm sơ đồ luồng điều khiển từ tài liệu vào đề xuất đầu tiên của mình. IMO nó dễ hiểu hơn nhiều so với bất kỳ mã giả hoặc giải thích nào, và đây thực sự là phần đen nhất của voodoo viết lại mod.
SáT

Số 6 là một thỏa thuận rất lớn. Viết lại các quy tắc ứng xử khác nhau trong các tệp cấu hình apache tiêu chuẩn so với các tệp .htaccess phải thu hút được nhiều người.
Iain Collins

Một cái gì đó có thể đáng để thêm vào những gợi ý này: Tôi đã dành thời gian để gỡ lỗi một vấn đề với nó chuyển hướng và không viết lại. Hóa ra tôi đã viết lại thành "/ bình luận" khi tôi muốn "/ bình luận /". Nó được viết lại thành "/ bình luận" và sau đó máy chủ đang chuyển hướng đến "/ bình luận /". Hành vi rõ ràng đối với những người đã sử dụng Apache nhưng có lẽ ít hơn đối với những người không như tôi.
Chris

Câu trả lời:


132

Dưới đây là một số mẹo bổ sung về các quy tắc kiểm tra có thể dễ dàng gỡ lỗi cho người dùng trên lưu trữ được chia sẻ

1. Sử dụng tác nhân người dùng giả

Khi kiểm tra quy tắc mới, hãy thêm một điều kiện để chỉ thực hiện quy tắc đó với faketác nhân người dùng mà bạn sẽ sử dụng cho các yêu cầu của mình. Bằng cách này, nó sẽ không ảnh hưởng đến bất kỳ ai khác trên trang web của bạn.

ví dụ

#protect with a fake user agent
RewriteCond %{HTTP_USER_AGENT}  ^my-fake-user-agent$
#Here is the actual rule I am testing
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] 
RewriteRule ^ http://www.domain.com%{REQUEST_URI} [L,R=302] 

Nếu bạn đang sử dụng Firefox, bạn có thể sử dụng User Agent Switcher để tạo ra các chuỗi đại lý giả sử dụng và thử nghiệm.

2. Không sử dụng 301 cho đến khi bạn hoàn thành thử nghiệm

Tôi đã thấy rất nhiều bài đăng mà mọi người vẫn đang kiểm tra các quy tắc của họ và họ đang sử dụng 301. KHÔNG .

Nếu bạn không sử dụng đề xuất 1 trên trang web của mình, không chỉ bạn mà bất kỳ ai truy cập trang web của bạn tại thời điểm đó cũng sẽ bị ảnh hưởng bởi 301.

Hãy nhớ rằng chúng là vĩnh viễn và được tích cực lưu trữ bởi trình duyệt của bạn. Sử dụng 302 thay vì cho đến khi bạn chắc chắn, sau đó thay đổi thành 301.

3. Hãy nhớ rằng 301 được lưu trữ mạnh mẽ trong trình duyệt của bạn

Nếu quy tắc của bạn không hoạt động và nó phù hợp với bạn và bạn không sử dụng đề xuất 1 và 2, thì hãy kiểm tra lại sau khi xóa bộ nhớ cache của trình duyệt hoặc trong khi duyệt web riêng tư.

4. Sử dụng công cụ HTTP Capture

Sử dụng công cụ chụp HTTP như Fiddler để xem lưu lượng HTTP thực tế giữa trình duyệt của bạn và máy chủ.

Trong khi những người khác có thể nói rằng của bạn site does not look right, thay vào đó bạn có thể nhìn thấy và báo cáo điều đó all of the images, css and js are returning 404 errors, nhanh chóng thu hẹp vấn đề.

Trong khi những người khác sẽ báo cáo rằng bạn started at URL A and ended at URL C, bạn sẽ có thể thấy rằng họ đã bắt đầu vào lúc đó URL A, were 302 redirected to URL B and 301 redirected to URL C. Ngay cả khi URL C là mục tiêu cuối cùng, bạn sẽ biết rằng điều này không tốt cho SEO và cần phải được sửa chữa.

Bạn sẽ có thể thấy các tiêu đề bộ đệm được đặt ở phía máy chủ, phát lại các yêu cầu, sửa đổi các tiêu đề yêu cầu để kiểm tra ....



9
Ulrich, cảm ơn rất nhiều cho đầu vào này. Bạn đã chọn một số khía cạnh mà tôi đã không nghĩ đến việc đưa vào danh sách của tôi. Về vấn đề gỡ lỗi 301, tôi sử dụng Chrome trong "Duyệt web riêng tư" (AKA "Chế độ khiêu dâm") vì điều này sẽ loại bỏ thông tin trạng thái này khi bạn đóng cửa sổ. Tôi hy vọng rằng bạn không phiền tôi không "chấp nhận" đây là một điểm quan trọng, nhưng không phải là một câu trả lời tốt nhất. Cảm ơn một lần nữa. :)
TerryE

1
Để làm cho nó rõ ràng (bạn có mã trong mã của mình nhưng không phát hiện ra nó) nhưng để đảm bảo rằng bạn đang sử dụng chuyển hướng 302 chứ không phải 301 bạn cần[L,R=302]
icc97

6
Bạn không cần chỉ định rõ ràng chỉ [L, R=302]cần làm [L,R]mặc định là302
Rahil Wazir

2
@goodeye, cũng xem hộp kiểm "Chrome> Cài đặt> Chung> Tắt bộ đệm trong khi DevTools đang mở".
johnsnails 11/03/2016

83

Kiểm tra viết lại .htaccess trực tuyến

Tôi đã tìm thấy sự trợ giúp này của Google cho RegEx, nó giúp tôi tiết kiệm rất nhiều thời gian khỏi việc phải tải lên các .htaccesstệp mới mỗi khi tôi thực hiện một sửa đổi nhỏ.

từ trang web:

thử nghiệm htaccess

Để kiểm tra quy tắc viết lại htaccess của bạn, chỉ cần điền vào url bạn đang áp dụng quy tắc, đặt nội dung của htaccess của bạn trên khu vực đầu vào lớn hơn và nhấn nút "Kiểm tra ngay".


6
Cảm ơn con trỏ đến công cụ này, mà tôi đã tìm ra cách trực tiếp nhất để gỡ lỗi vấn đề của mình.
BobHy

Nếu bạn có quyền truy cập ssh vào không gian web của mình, một tùy chọn khác là thay đổi trực tiếp .htaccess thông qua trình chỉnh sửa trên máy chủ.
sjas

Bạn sẽ cần phải bỏ qua cảnh báo ssl b / c chứng chỉ trang web đang gặp sự cố. Nhưng trang web vẫn còn đó. Đây là giải pháp tốt nhất và dễ nhất. Nó cung cấp cái nhìn sâu sắc đáng kinh ngạc về những gì sai và kết quả trong việc khắc phục vấn đề NHANH CHÓNG.
chập chững

Cảm ơn đã chỉ vào công cụ này. Nó rất hữu ích, Đôi khi, việc gỡ lỗi apache của chính nó rất khó khăn. Cảm ơn. Cảm ơn lớn
Benyamin Limanto

Có vẻ như liên kết được tham chiếu là lỗi và không phải lúc nào cũng cung cấp cho bạn đầu ra chính xác. Vui lòng kiểm tra trên apache thực tế để hoàn toàn chắc chắn.
Parth

13

Đừng quên rằng trong các tệp .htaccess, đó là một URL tương đối được khớp.

Trong tệp .htaccess, RewriteRule sau sẽ không bao giờ khớp:

RewriteRule ^/(.*)     /something/$s

4
Có, chuỗi được đưa vào Quy tắc Viết lại là tương đối và do đó bị tước trên bất kỳ đầu nào /, nhưng việc tước chuỗi này không xảy ra đối với các chuỗi khớp được lắp ráp trong các lệnh Rewrite Cond .
TerryE

8

Đảm bảo rằng cú pháp của mỗi Regapi là chính xác

bằng cách kiểm tra một tập các mẫu kiểm tra để đảm bảo đó là một cú pháp hợp lệ và thực hiện những gì bạn dự định với một phạm vi URI kiểm tra đầy đủ.

Xem regrecCheck.php bên dưới để biết một tập lệnh đơn giản mà bạn có thể thêm vào thư mục riêng / kiểm tra trong trang web của mình để giúp bạn làm điều này. Tôi đã giữ bản tóm tắt này thay vì đẹp. Chỉ cần vượt qua điều này vào một tập tin regexpCheck.phptrong một thư mục thử nghiệm để sử dụng nó trên trang web của bạn. Điều này sẽ giúp bạn xây dựng bất kỳ biểu thức chính quy nào và kiểm tra nó dựa trên danh sách các trường hợp kiểm tra khi bạn làm như vậy. Tôi đang sử dụng công cụ PHP PCRE ở đây, nhưng đã xem qua nguồn Apache, cái này về cơ bản giống với cái được sử dụng trong Apache. Có rất nhiều HowTos và hướng dẫn cung cấp các mẫu và có thể giúp bạn xây dựng các kỹ năng regrec của mình.

Liệt kê 1 - regrecCheck.php

<html><head><title>Regexp checker</title></head><body>
<?php 
    $a_pattern= isset($_POST['pattern']) ? $_POST['pattern'] : "";
    $a_ntests = isset($_POST['ntests']) ? $_POST['ntests'] : 1;
    $a_test   = isset($_POST['test']) ? $_POST['test'] : array();

    $res = array(); $maxM=-1; 
    foreach($a_test as $t ){
        $rtn = @preg_match('#'.$a_pattern.'#',$t,$m);
        if($rtn == 1){
            $maxM=max($maxM,count($m));
            $res[]=array_merge( array('matched'),  $m );
        } else {
            $res[]=array(($rtn === FALSE ? 'invalid' : 'non-matched'));
        }
    } 
?> <p>&nbsp; </p>
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME'];?>">
    <label for="pl">Regexp Pattern: </label>
    <input id="p" name="pattern" size="50" value="<?php echo htmlentities($a_pattern,ENT_QUOTES,"UTF-8");;?>" />
    <label for="n">&nbsp; &nbsp; Number of test vectors: </label>
    <input id="n" name="ntests"  size="3" value="<?php echo $a_ntests;?>"/>
    <input type="submit" name="go" value="OK"/><hr/><p>&nbsp;</p>
    <table><thead><tr><td><b>Test Vector</b></td><td>&nbsp; &nbsp; <b>Result</b></td>
<?php 
    for ( $i=0; $i<$maxM; $i++ ) echo "<td>&nbsp; &nbsp; <b>\$$i</b></td>";
    echo "</tr><tbody>\n";
    for( $i=0; $i<$a_ntests; $i++ ){
        echo '<tr><td>&nbsp;<input name="test[]" value="', 
            htmlentities($a_test[$i], ENT_QUOTES,"UTF-8"),'" /></td>';
        foreach ($res[$i] as $v) { echo '<td>&nbsp; &nbsp; ',htmlentities($v, ENT_QUOTES,"UTF-8"),'&nbsp; &nbsp; </td>';}
        echo "</tr>\n";
    }
?> </table></form></body></html>

1
Lưu ý nhanh: import_request_variableskhông được dùng nữa trong PHP 5.3 và bị xóa trong 5.4. extract($_GET)cùng với extract($_POST)có thể thực hiện cùng một chức năng, nhưng tất cả các biến sẽ cần loại bỏ tiền tố khỏi tên của chúng. Nguồn: php.net/manual/en/feft.import-request-variables.php
Jeff Lambert

@ Đồng hồ, cảm ơn. Tôi đã cập nhật phiên bản địa phương của mình để tương thích 5,4 một năm trước, nhưng quên thay đổi bài đăng này. Bây giờ đã xong.
TerryE

ồ, ngay cả sau khi chỉnh sửa, không thể có kết quả tốt chỉ bằng cách sao chép mã của bạn ... nhưng với trình điều khiển regex xung quanh, tôi cho rằng công cụ của bạn đã lỗi thời. kiểm tra các công cụ tuyệt vời này: regex101.com hoặc refiddle.com hoặc regexr.com
phần mềm hexerei

@hexereisoftware, bài đăng này đã 3 năm tuổi, vì vậy có thể có các vấn đề tinh vi tùy thuộc vào phiên bản PHP hiện đang sử dụng và phiên bản Apache. Tuy nhiên, có nhiều biến thể của regrec từng có sự khác biệt tinh tế. Như tôi đã nói mã Apache sử dụng một công cụ PCRE rất giống với công cụ PHP. Tôi không chắc chắn các khác biệt với các biến thể của othe như .Net là gì, vì vậy trong khi đề xuất của bạn về việc sử dụng tài nguyên trực tuyến là tốt, tôi sẽ sử dụng một cú pháp hỗ trợ rõ ràng cú pháp apache hoặc PHP. :-)
TerryE

Perl sẽ gần nhất, nhưng php sử dụng cùng một cú pháp
phần mềm hexerei

7

Hãy chắc chắn rằng bạn sử dụng dấu phần trăm trước các biến, không phải ký hiệu đô la.

%{HTTP_HOST}, không phải ${HTTP_HOST} . Sẽ không có gì trong error_log, sẽ không có Lỗi máy chủ nội bộ, regrec của bạn vẫn đúng, quy tắc sẽ không khớp. Điều này thực sự gớm ghiếc nếu bạn làm việc với các mẫu django / genshi rất nhiều và có ${}sự thay thế thay đổi trong bộ nhớ cơ.


1
Có, các biến thay thế $ liên quan đến mẫu RewriteRule cuối cùng và % biến liên quan đến mẫu RewriteCond cuối cùng và các đặc biệt như% {env: XXX}
TerryE

7

Một trong vài giờ mà tôi đã lãng phí:

Nếu bạn đã áp dụng tất cả các mẹo này và chỉ gặp phải 500 lỗi vì bạn không có quyền truy cập vào nhật ký lỗi máy chủ, có thể vấn đề không nằm ở .htaccess mà là trong các tệp mà nó chuyển hướng.

Sau khi tôi đã khắc phục sự cố .htaccess của mình, tôi đã mất thêm hai giờ để cố gắng khắc phục nó thêm, mặc dù tôi chỉ đơn giản là đã quên mất một số quyền.


Tôi sử dụng dịch vụ web lưu trữ truy cập được chia sẻ cho trang web cá nhân của mình, nhưng những gì tôi đã làm là thiết lập một máy ảo thử nghiệm, điều này phản ánh chính xác điều này về cấu hình PHP / Apache, thư mục chính, v.v. quản trị Tôi có thể cho phép viết lại ghi nhật ký để chẩn đoán bất kỳ .htaccessvấn đề khó khăn .
TerryE

6

Đặt các biến môi trường và sử dụng các tiêu đề để nhận chúng:

Bạn có thể tạo các biến môi trường mới với các dòng RewriteRule, như được đề cập bởi OP:

RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]

Nhưng nếu bạn không thể làm cho một kịch bản phía máy chủ hoạt động, làm thế nào bạn có thể đọc biến môi trường này? Một giải pháp là đặt tiêu đề:

Header set TEST_FOOBAR "%{REDIRECT_TEST0}e"

Giá trị chấp nhận các chỉ định định dạng , bao gồm cả %{NAME}echỉ định cho các biến môi trường (đừng quên chữ thường e). Đôi khi, bạn sẽ cần thêm REDIRECT_tiền tố, nhưng tôi đã không làm việc khi tiền tố được thêm vào và khi nào thì không.


Bạn đã hiểu rõ hơn khi nào nên sử dụng hay không sử dụng REDIRECT_tiền tố? Ngoài ra, tôi cũng thấy thuật ngữ về tiền tố trong các bối cảnh (htaccess) khác, nhưng chưa bao giờ rõ ràng chính xác ý nghĩa của nó là gì. Điều đó có nghĩa là bạn phải đặt tên cho biến của mình bằng tiền tố hoặc thêm tiền tố vào biến đã đặt tên của bạn, khi sử dụng các lệnh nhất định (chứ không phải các lệnh khác)? Ví dụ của bạn là ví dụ đầu tiên hiển thị cả định nghĩa var và cách sử dụng var, vì vậy từ đây tôi có xu hướng nghĩ về cái sau! Các tài liệu đã được giúp đỡ rất ít - họ cho rằng chúng ta biết quá nhiều và cung cấp quá ít tài liệu tham khảo / liên kết.
SherylHohman

5

Nếu bạn đang tạo chuyển hướng, hãy kiểm tra độ cong để tránh các sự cố bộ đệm của trình duyệt. Chỉ sử dụng -I để tìm nạp các tiêu đề http. Sử dụng -L để theo dõi tất cả các chuyển hướng.


3

Tôi đã tìm thấy câu hỏi này trong khi cố gắng gỡ lỗi các vấn đề mod_rewrite của mình và nó chắc chắn có một số lời khuyên hữu ích. Nhưng cuối cùng, điều quan trọng nhất là đảm bảo bạn có cú pháp regex chính xác. Do các vấn đề với cú pháp RE của riêng tôi, việc cài đặt tập lệnh regapiCheck.php không phải là một lựa chọn khả thi.

Nhưng vì Apache sử dụng biểu thức chính quy tương thích Perl (PCRE), nên bất kỳ công cụ nào giúp viết PCRE đều có ích. Trước đây tôi đã sử dụng công cụ của RegexPlanet với Java và Javascript REs và rất vui khi thấy họ cũng hỗ trợ Perl.

Chỉ cần nhập biểu thức thông thường của bạn và một hoặc nhiều URL ví dụ và nó sẽ cho bạn biết nếu biểu thức chính quy khớp với (một "1" trong cột "~ =") và nếu có thể, bất kỳ nhóm phù hợp nào (các số trong "tách" cột sẽ tương ứng với các số mà Apache mong đợi, ví dụ: $ 1, $ 2, v.v.) cho mỗi URL. Họ tuyên bố hỗ trợ PCRE là "trong bản beta", nhưng đó chỉ là những gì tôi cần để giải quyết các vấn đề cú pháp của mình.

http://www.regexplanet.com/advified/perl/index.html

Tôi chỉ đơn giản là đã thêm một nhận xét vào một câu trả lời hiện có nhưng danh tiếng của tôi chưa ở mức đó. Hy vọng điều này sẽ giúp được ai đó.


công cụ tuyệt vời, nhưng hình thức khủng khiếp ... hãy xem các công cụ tuyệt vời này: regex101.com hoặc refiddle.com hoặc regexr.com
phần mềm hexerei

3

Về 4., bạn vẫn cần đảm bảo rằng "đoạn mã giả" của bạn thực sự là URL đích sau khi tất cả việc viết lại được thực hiện, hoặc bạn sẽ không thấy gì cả!

Một mẹo tương tự / liên quan (xem câu hỏi này ) là chèn một quy tắc tạm thời, chẳng hạn như:

RewriteRule (.*) /show.php?url=$1 [END]

Trường hợp show.phpmột số tập lệnh rất đơn giản chỉ hiển thị các $_GETtham số của nó (bạn cũng có thể hiển thị các biến môi trường, nếu bạn muốn).

Điều này sẽ dừng việc viết lại tại điểm bạn chèn nó vào bộ quy tắc, giống như một điểm dừng trong trình gỡ lỗi.

Nếu bạn đang sử dụng Apache <2.3.9, bạn sẽ cần sử dụng [L]hơn là [END]và sau đó bạn có thể cần thêm:

RewriteRule ^show.php$ - [L]

Ở đầu trang quy tắc của bạn, nếu URL /show.phptự nó được viết lại.


3

Một số sai lầm tôi quan sát thấy xảy ra khi viết .htaccess

Việc sử dụng ^(.*)$lặp đi lặp lại trong nhiều quy tắc, sử dụng ^(.*)$khiến các quy tắc khác bị bất lực trong hầu hết các trường hợp, vì nó khớp với tất cả các url trong một lần nhấn.

Vì vậy, nếu chúng ta đang sử dụng quy tắc cho url này, sapmle/urlnó cũng sẽ tiêu thụ url này sapmle/url/string.


[L] cờ nên được sử dụng để đảm bảo quy tắc của chúng tôi đã xử lý xong.


Nên biết về:

Sự khác biệt về% n và $ n

%nđược kết hợp trong %{RewriteCond}một phần và $nphù hợp với %{RewriteRule}một phần.

Hoạt động của RewriteBase

Lệnh RewriteBase chỉ định tiền tố URL được sử dụng cho các chỉ thị RewriteRule trên mỗi thư mục (htaccess) thay thế một đường dẫn tương đối.

Lệnh này là bắt buộc khi bạn sử dụng một đường dẫn tương đối để thay thế trong ngữ cảnh mỗi thư mục (htaccess) trừ khi bất kỳ điều kiện nào sau đây là đúng:

Yêu cầu ban đầu và thay thế, bên dưới DocumentRoot (trái ngược với khả năng tiếp cận bằng các phương tiện khác, chẳng hạn như Bí danh). Đường dẫn hệ thống tập tin đến thư mục chứa RewriteRule, được thêm vào bởi sự thay thế tương đối cũng có giá trị như một đường dẫn URL trên máy chủ (điều này rất hiếm). Trong Apache HTTP Server 2.4.16 trở lên, lệnh này có thể được bỏ qua khi yêu cầu được ánh xạ qua Bí danh hoặc mod_userdir.


2

Nếu bạn dự định viết nhiều hơn một dòng quy tắc trong .htacess,
thậm chí đừng nghĩ đến việc thử một trong những phương pháp sửa lỗi nóng đó để gỡ lỗi.

Tôi đã lãng phí nhiều ngày để thiết lập nhiều quy tắc, mà không có phản hồi từ LOG, chỉ để cuối cùng từ bỏ.
Tôi đã nhận được Apache trên PC của mình, sao chép toàn bộ trang web vào ổ cứng của nó và đã sắp xếp toàn bộ quy tắc, sử dụng nhật ký, rất nhanh.
Sau đó, tôi xem lại các quy tắc cũ của tôi, đã được làm việc. Tôi thấy họ không thực sự làm những gì mong muốn. Một quả bom hẹn giờ, được đưa ra một địa chỉ hơi khác.

Có rất nhiều hố rơi trong các quy tắc viết lại, đó không phải là một điều logic thẳng.
Bạn có thể tải Apache lên và chạy trong mười phút, đó là 10 MB, giấy phép tốt, * NIX / WIN / MAC đã sẵn sàng, ngay cả khi không cài đặt.
Ngoài ra, hãy kiểm tra các dòng tiêu đề của máy chủ của bạn và nhận cùng một phiên bản Apache từ kho lưu trữ của chúng nếu nó cũ. OP của tôi vẫn ở trên 2.0; nhiều thứ không được hỗ trợ


papo, tôi đã chạy các máy chủ chuyên dụng, VPS được lưu trữ bởi ISP và VM riêng trong cấu trúc phát triển của mình, nhưng tôi vẫn sử dụng dịch vụ lưu trữ chia sẻ cho các miền và email công khai của mình, đơn giản vì sử dụng một quản lý hoàn toàn hiệu quả và tiết kiệm chi phí dịch vụ cho những. Howto này thực sự được nhắm mục tiêu vào người dùng dịch vụ chia sẻ. Việc cấu hình một VM riêng để phản ánh đầy đủ dịch vụ chia sẻ là rất khó. Có, nếu sau đó bạn có thể sử dụng VM kiểm tra, nhưng tôi vẫn thỉnh thoảng sử dụng các "thủ thuật" này trên dịch vụ chia sẻ của mình.
TerryE

1
Tôi sẽ đồng ý với điều này nếu chữ A của bạn được đóng khung như một đề xuất thay thế cho mod_rewritecác quy tắc gỡ lỗi , nhưng phần mở đầu "thậm chí không nghĩ về nó" chỉ là lời khuyên tồi cho những người dùng dịch vụ chia sẻ cơ bản đang đấu tranh để hiểu lý do tại sao các htaccesstệp của họ phát sinh ' T làm việc theo cách mà họ nên làm.
TerryE

Tôi xin lỗi nếu nó có vẻ như công việc của bạn để tập hợp một bộ sưu tập lời khuyên tốt đẹp là vô giá trị. Tôi không muốn điều đó. Hãy tin tôi, tôi đã rất vui khi đọc và làm theo nhiều lời khuyên chủ đề này được cung cấp. Nhưng các quy tắc của tôi dần trở nên phức tạp và cuối cùng, tôi đã lãng phí rất nhiều thời gian chỉ vì không muốn gặp rắc rối khi cài đặt máy chủ Apache và thực hiện sửa lỗi như nó nên được thực hiện. Hơn thế nữa, tôi không học được gì, như tôi đã không thấy, trong nhật ký, những gì đang thực sự xảy ra. Và có rất nhiều thứ đang diễn ra. Tôi tin rằng nó cũng có giá trị để chia sẻ kinh nghiệm này.
papo

đối với phần thứ hai, có một IF. Văn bản của tôi chưa bao giờ bắt đầu với 'thậm chí không nghĩ về' Tôi thấy bây giờ, từ ngữ này có vẻ hơi khắc nghiệt nhưng tất cả đều đúng. Đặc biệt là cho những người mới làm điều này và đấu tranh để hiểu. Các lời khuyên ở đây có thể khiến họ hiểu sai, như tôi, rằng tất cả những gì tôi cần là một biểu thức chính xác, nó không đơn giản như điểm 6 của bạn) PATH_INFO khiến tôi gặp nhiều rắc rối và đó không phải là lỗi như bạn nói, mà là một tính năng. Nếu bạn không muốn nó được thêm lại, hãy sử dụng [DPI]. Nhưng chỉ khi bạn nhìn vào nhật ký, bạn sẽ thấy nó được thêm vào đó. Đó là lý do tại sao, nhiều hơn một dòng và tốt hơn hết là bạn nên sử dụng nhật ký
papo

1
Xin lỗi @papo, nhưng lý do tôi bỏ phiếu -1 là tôi nghĩ rằng điều này "thậm chí không nghĩ về nó" là lời khuyên tồi, IMO. Nếu quan điểm của bạn là "trên một độ phức tạp nhất định, thì bạn có thể thấy việc cài đặt một dịch vụ Apache cục bộ để gỡ lỗi các .htaccesstệp của mình " sẽ dễ dàng hơn . Đúng, rất dễ dàng để thiết lập một dịch vụ Apache cục bộ, nhưng để nó phản ánh dịch vụ lưu trữ chia sẻ của nhà cung cấp dịch vụ có thể phức tạp và vượt quá mức kỹ năng của nhiều người dùng có thể chỉ sử dụng thiết lập Wordpress chỉ bằng một cú nhấp chuột, nói, và có vấn đề với .htaccesstập tin của họ .
TerryE

1

Tôi sẽ để nó ở đây, có thể là chi tiết rõ ràng, nhưng khiến tôi đập đầu hàng giờ: hãy cẩn thận khi sử dụng %{REQUEST_URI}bởi vì những gì @Krist van Besien nói trong câu trả lời của anh ấy là hoàn toàn đúng, nhưng không phải cho chuỗi REQUEST_URI , bởi vì điều này không đúng TestString bắt đầu bằng một /. Vì vậy, hãy cẩn thận:

RewriteCond %{REQUEST_URI} ^/assets/$  
                            ^
                            | check this pesky fella right here if missing

0

(Tương tự như ý tưởng Doin) Để hiển thị những gì đang được khớp, tôi sử dụng mã này

$keys = array_keys($_GET);
foreach($keys as $i=>$key){
    echo "$i => $key <br>";
}

Lưu nó vào r.php trên máy chủ gốc và sau đó thực hiện một số thử nghiệm trong .htaccess
Ví dụ: tôi muốn khớp các url không bắt đầu bằng tiền tố ngôn ngữ

RewriteRule ^(?!(en|de)/)(.*)$ /r.php?$1&$2 [L] #$1&$2&...
RewriteRule ^(.*)$ /r.php?nomatch [L] #report nomatch and exit

1
chỉ sử dụng sơ đồ phpinfo () như tôi đã đề cập ở điểm 4 trên O / P của tôi về cơ bản là điều tương tự. Tìm kiếmQUERY_STRING
TerryE

0

như được chỉ ra bởi @JCastell, người kiểm tra trực tuyến thực hiện tốt công việc kiểm tra các chuyển hướng riêng lẻ đối với tệp .htaccess. Tuy nhiên, điều thú vị hơn là api tiếp xúc có thể được sử dụng để kiểm tra hàng loạt danh sách các url sử dụng đối tượng json. Tuy nhiên, để làm cho nó hữu ích hơn, tôi đã viết một tệp tập lệnh bash nhỏ sử dụng curljq để gửi danh sách các url và phân tích phản hồi json vào đầu ra được tạo thành CSV với số dòng và quy tắc khớp trong tệp htaccess cùng với url được chuyển hướng, làm cho nó khá thuận tiện để so sánh danh sách các url trong bảng tính và nhanh chóng xác định quy tắc nào không hoạt động.


-1

Nếu bạn đang làm việc với url, Bạn có thể muốn kiểm tra xem bạn có "Bật Mod Rewrite" không

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.