.htaccess 재 작성 규칙 디버깅을위한 팁


272

많은 포스터는 .htaccess파일 내에서 RewriteRule 및 RewriteCond 문을 디버깅하는 데 문제가 있습니다. 이들 중 대부분은 공유 호스팅 서비스를 사용하고 있으므로 루트 서버 구성에 액세스 할 수 없습니다. 많은 응답자들이 제안한대로 .htaccess파일 재 작성을 피할 수 없으며 RewriteLogLevel "을 활성화 할 수 없습니다 . 또한 많은 .htaccess특정 함정과 제약 조건이 잘 설명되어 있지 않습니다. 로컬 테스트 LAMP 스택 설정에는 대부분의 학습 곡선이 너무 많습니다. .

그래서 내 Q는 규칙을 스스로 디버깅 하는 방법을 권장합니다 . 아래에 몇 가지 제안을 제공합니다. 다른 제안을 부탁드립니다.

  1. mod_rewrite 엔진이 .htaccess파일을 순환한다는 것을 이해 하십시오 . 엔진은 다음 루프를 실행합니다.

    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
    

    따라서 규칙이 반복적으로 실행되며 URI 경로를 변경하면 다른 .htaccess파일이 있으면 실행될 수 있습니다. 따라서 필요한 경우 RewriteCond규칙 실행을 중지하기 위해 추가를 추가하여이 루프를 종료하십시오 . .htaccess다중 레벨 규칙 세트를 명시 적으로 사용하지 않는 한 하위 레벨 재 작성 규칙 세트를 삭제하십시오 .

  2. 테스트 패턴 세트에 대해 테스트하여 각 Regexp의 구문이 올바른지 확인하고 이것이 유효한 구문인지 확인하고 전체 범위의 테스트 URI로 의도 한 작업을 수행하는지 확인하십시오. 자세한 내용은 아래 답변 을 참조하십시오.

  3. 테스트 디렉토리에서 규칙을 점진적으로 빌드하십시오. " .htaccess경로 에서 가장 깊은 파일 실행 "을 사용하여 기본 규칙을 망치거나 사이트 작동을 중지하지 않고 여기에서 별도의 테스트 디렉토리 (트리) 및 디버그 규칙 세트를 설정할 수 있습니다. 개별 규칙에 실패를 현지화하는 유일한 방법이므로 한 번에 하나씩 추가해야합니다.

  4. 더미 스크립트 스텁을 사용하여 서버 및 환경 변수를 덤프하십시오 . (참조 Listing 2는 앱 사용이 말할 경우), blog/index.php당신은이 점을 복사 할 수 test/blog/index.php와 귀하의 블로그 규칙을 테스트하는 데 사용할 test하위 디렉토리. 또한 환경 변수를 사용하여 대체 문자열을 올바르게 해석하는 데 다시 쓰기 엔진이 있는지 확인할 수 있습니다 (예 :

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

    phpinfo 덤프에서 REDIRECT_ * 변수를 찾으십시오 . BTW, 나는 이것을 사용했고 내 사이트에서 %{ENV:DOCUMENT_ROOT_REAL}대신 사용해야한다는 것을 발견했습니다 . 리디렉터 루핑의 경우 REDIRECT_REDIRECT_ * 변수는 이전 패스를 나열합니다. 기타..

  5. 브라우저가 잘못된 301 리디렉션을 캐싱하여 물리지 않도록하십시오 . 아래 답변을 참조하십시오 . 덕분에Ulrich Palha 에게 .

  6. 다시 쓰기 엔진은 내부 하위 요청 (1) 과 버그가 있고 종종 PATH_INFO 처리가 잘못되어 .htaccess컨텍스트 내에서 계단식 규칙에 민감하게 보입니다 (즉, RewriteRule결과는 대체로 이어지고 추가 규칙에는 영향을 미칩니다 ) [NS], [L] 및 [PT] 플래그를 사용하여 방지하십시오.

더 이상의 의견이나 제안?

Listing 1-phpinfo

<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);

10
이것들은 좋습니다 ... 아마도 당신은 그것들을 질문에서 답으로 옮겨야합니다.
w00t

@ w00t, 다른 답변에서 링크로 참조하고 싶기 때문에 귀하의 제안에 따라 정규 표현식 검사기를 분리했습니다.
TerryE

3
문서의 제어 흐름 다이어그램을 첫 번째 제안 에 추가 할 수 있습니다 . IMO 의사 코드 나 설명보다 이해하기가 훨씬 쉽고, 이것은 mod-rewrite 부두의 가장 검은 부분입니다.
SáT

6 번은 큰 문제입니다. 표준 아파치 구성 파일과 .htaccess 파일에서 다르게 동작하는 재 작성 규칙은 많은 사람들을 사로 잡아야합니다.
Iain Collins

이 힌트에 추가 할 가치가있는 것 : 리디렉션과 재 작성이 아닌 문제를 디버깅하는 데 시간을 보냈습니다. "/ comment /"를 원할 때 "/ comment"로 다시 쓰는 것으로 나타났습니다. "/ comment"로 다시 쓰는 중이고 서버가 "/ comment /"로의 리디렉션을 수행하고있었습니다. 아파치에 익숙한 사람들에게는 명백한 행동이지만 아마도 나와 같은 멍청한 사람들에게는 그렇지 않을 것입니다.
크리스

답변:


132

다음은 공유 호스팅에서 사용자의 디버깅을 용이하게 할 수있는 규칙 테스트에 대한 추가 팁입니다.

1. 가짜 사용자 에이전트 사용

새 규칙을 테스트 할 때는 fake요청에 사용할 사용자 에이전트 로만 실행하도록 조건을 추가 하십시오. 이렇게하면 사이트의 다른 사람에게는 영향을 미치지 않습니다.

예 :

#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] 

Firefox를 사용하는 경우 User Agent Switcher 를 사용하여 가짜 사용자 에이전트 문자열을 작성하고 테스트 할 수 있습니다.

2. 테스트가 끝날 때까지 301을 사용하지 마십시오

사람들이 여전히 규칙을 테스트하고 301을 사용하는 게시물이 너무 많습니다. 하지 마십시오 .

귀하의 사이트에서 제안 1을 사용하지 않을 경우 귀하뿐만 아니라 당시 귀하의 사이트를 방문한 모든 사람이 301의 영향을받습니다.

그것들은 영구적이며 브라우저에 의해 적극적으로 캐시됩니다. 확실해질 때까지 302를 사용하고 301로 변경하십시오.

3. 301은 브라우저에 적극적으로 캐시됩니다

규칙이 작동하지 않고 올바른 것으로 보이며 제안 1 및 2를 사용하지 않은 경우 브라우저 캐시를 지우거나 개인 탐색 중에 다시 테스트하십시오.

4. HTTP 캡처 도구 사용

피들러 와 같은 HTTP 캡처 도구 사용 하여 브라우저와 서버 간의 실제 HTTP 트래픽을보십시오.

다른 사람들이 귀하의이라고 말할 수도 있지만 site does not look right대신all of the images, css and js are returning 404 errors 문제를 범위를 좁히고 있습니다.

다른 사람들이 당신을보고하는 동안 started at URL A and ended at URL C, 당신은 그들이 시작한 것을 볼 수 있습니다URL A, were 302 redirected to URL B and 301 redirected to URL C 입니다. URL C가 궁극적 인 목표 일지라도 이것이 SEO에 나쁘고 수정해야한다는 것을 알게 될 것입니다.

서버 측에 설정된 캐시 헤더를보고, 요청을 재생하고, 테스트 할 요청 헤더를 수정할 수 있습니다.



9
Ulrich,이 의견을 보내 주셔서 감사합니다. 당신은 내 목록에 넣을 생각하지 않은 몇 가지 측면을 선택했습니다. 301 디버깅 문제에서는 창을 닫을 때이 상태 정보를 덤프하므로 "개인 정보 탐색"(일명 "포르노 모드")에서 Chrome을 사용합니다. 중요한 점인 것처럼 이것을 "수락"하지 말고 하나의 최선의 대답은 아니라고 생각하지 않기를 바랍니다. 다시 감사합니다. :)
TerryE

1
명확하게하기 위해 (코드에 있지만 [L,R=302]
눈에 띄지

6
당신은 지정 명시 적으로 할 필요가 없습니다 [L, R=302]만 할 [L,R]기본입니다302
Rahil 지르

2
@goodeye에서 "Chrome> 설정> 일반> DevTools가 열려있는 동안 캐시 비활성화"체크 상자를 확인하십시오.
johnsnails

83

온라인 .htaccess 재 작성 테스트

RegEx 도움말에 대한 인터넷 검색을 찾았 으므로 .htaccess작은 수정 을 할 때마다 새 파일 을 업로드하지 않아도 많은 시간이 절약되었습니다 .

사이트에서 :

htaccess 테스터

htaccess 재 작성 규칙을 테스트하려면 규칙을 적용 할 URL을 채우고 htaccess 내용을 더 큰 입력 영역에 놓고 "지금 확인"단추를 누르십시오.


6
이 도구에 대한 포인터 덕분에 문제를 디버깅하는 가장 직접적인 방법을 찾았습니다.
BobHy

웹 공간에 ssh 액세스 권한이있는 경우 다른 옵션은 서버에서 편집기를 통해 .htaccess를 직접 변경하는 것입니다.
sjas

사이트 인증서에 문제가있는 SSL 경고를 무시해야합니다. 그러나 사이트는 여전히 존재합니다. 이것이 가장 쉽고 쉬운 솔루션입니다. 무엇이 잘못되었는지에 대한 놀라운 통찰력을 제공하고 FAST 문제를 해결합니다.
toddmo

이 도구를 가리켜 주셔서 감사합니다. 그것은 도움이됩니다. 때로는 아파치 htaccess 자체를 디버깅하는 것이 너무 어렵습니다. 감사. 큰 감사
Benyamin Limanto 2012

참조 된 링크가 버그가있는 것처럼 보이며 항상 정확한 결과를 제공하지는 않습니다. 실제 아파치를 확인하여 절대적으로 확인하십시오.
Parth

13

.htaccess 파일에서 일치하는 상대 URL임을 잊지 마십시오.

.htaccess 파일에서 다음 RewriteRule은 절대 일치하지 않습니다.

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

4
예, Rewrite Rule에 공급 된 문자열 은 상대적이므로 Leading /에서 제거되지만 Rewrite Cond 명령으로 어셈블 된 일치 문자열에 대해서는이 제거가 발생하지 않습니다 .
TerryE

8

각 Regexp의 구문이 올바른지 확인하십시오

테스트 패턴 세트에 대해 테스트하여 유효한 구문인지 확인하고 전체 테스트 URI로 의도 한대로 수행하는지 확인하십시오.

이를 위해 사이트의 개인 / 테스트 디렉토리에 추가 할 수있는 간단한 스크립트는 아래 regexpCheck.php를 참조하십시오 . 예쁘지 않고 간략하게 설명했습니다. 이것을 regexpCheck.php웹 사이트에서 사용하기 위해 테스트 디렉토리 의 파일 에 붙여 넣으십시오. 이렇게하면 정규 표현식을 작성하고 테스트 사례 목록과 비교하여 테스트 할 수 있습니다. 여기에서 PHP PCRE 엔진을 사용하고 있지만 Apache 소스를 살펴본 결과 기본적으로 Apache에서 사용되는 것과 동일합니다. 템플릿을 제공하고 정규 표현식 기술을 구축하는 데 도움이되는 많은 방법과 자습서가 있습니다.

Listing 1-regexpCheck.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
빠른 참고 사항 : import_request_variablesPHP 5.3에서 더 이상 사용되지 않으며 5.4에서 제거되었습니다. extract($_GET)와 결합 extract($_POST)하면 동일한 기능을 수행 할 수 있지만 모든 변수의 이름에서 접두사를 제거해야합니다. 출처 : php.net/manual/en/function.import-request-variables.php
Jeff Lambert

@ watcher, 감사합니다. 1 년 전에 로컬 버전을 5.4와 호환되도록 업데이트했지만이 게시물을 변경하지 않았습니다. 이제 끝났습니다.
TerryE

오, 내 편집 후에도 코드를 복사하는 것만으로도 좋은 결과를 얻을 수는 없지만 정규식 피들러를 사용하면 도구가 더 이상 사용되지 않습니다. 이 멋진 도구를 확인하십시오 : regex101.com 또는 refiddle.com 또는 regexr.com
hexerei 소프트웨어

@ hexereisoftware,이 게시물은 3 세이므로 현재 사용중인 PHP 버전과 Apache 버전에 따라 미묘한 문제가있을 수 있습니다. 그러나 각각 미묘한 차이가있는 많은 regexp 변형이 있습니다. 내가 말했듯이 아파치 코드는 PHP 엔진과 매우 유사한 PCRE 엔진을 사용합니다. .Net과 같은 othe 변형의 차이점이 무엇인지 잘 모르겠으므로 온라인 리소스 사용에 대한 제안이 좋은 반면 아파치 또는 PHP 구문을 명시 적으로 지원하는 것을 고수 할 것입니다. :-)
TerryE

펄은 가장 가깝지만 PHP는 같은 문법을 사용한다
헥스 레이 소프트웨어

7

달러 기호가 아닌 변수 앞에 백분율 기호를 사용해야합니다.

그것은이다 %{HTTP_HOST}, 하지 ${HTTP_HOST} . error_log에는 아무것도 없으며 내부 서버 오류는 없으며 정규 표현식이 여전히 정확하며 규칙이 일치하지 않습니다. django / genshi 템플릿으로 많은 작업을 ${}하고 근육 메모리에서 변수를 대체 하면 정말 무시 무시합니다 .


1
예, $의 대체 변수 마지막 RewriteRule의 패턴과 관련하여 %의 사람이 마지막한다 RewriteCond 패턴 등 %의 특별 관계 {ENV : XXX}
TerryE

7

내가 낭비한 두 시간 중 하나 :

이 모든 팁을 적용하고 서버 오류 로그에 액세스 할 수 없기 때문에 500 개의 오류 만 발생하는 경우 .htaccess가 아니라 리디렉션되는 파일에 문제가있을 수 있습니다.

.htaccess- 문제를 해결 한 후에는 일부 권한에 대해 잊어 버린 경우에도 2 시간 더 더 문제를 해결하려고했습니다.


개인 사이트에 공유 액세스 호스팅 웹 서비스를 사용하고 있지만 PHP / Apache 구성, 홈 디렉토리 등과 관련하여 대략적으로 미러링하는 테스트 VM을 설정하는 것이 좋습니다. 그러나이 VM은 관리자 어려운 .htaccess문제 를 진단하기 위해 다시 쓰기 로깅을 활성화 할 수 있습니다.
TerryE

6

환경 변수를 설정하고 헤더를 사용하여 수신하십시오.

OP에서 언급 한 것처럼 RewriteRule 줄을 사용하여 새 환경 변수를 만들 수 있습니다.

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

그러나 서버 측 스크립트가 작동하지 않으면이 환경 변수를 어떻게 읽을 수 있습니까? 한 가지 해결책은 헤더를 설정하는 것입니다.

Header set TEST_FOOBAR "%{REDIRECT_TEST0}e"

이 값 %{NAME}e 환경 변수 지정자를 포함하여 형식 지정자를 허용합니다 (소문자 e를 잊지 마십시오). 때로는 REDIRECT_접두사 를 추가해야 하지만 접두사가 추가 될 때와 접두사가 추가되지 않을 때는 해결하지 못했습니다.


REDIRECT_접두사 를 사용하거나 사용하지 않을 때에 대한 추가 정보를 얻었 습니까? 또한 다른 (htaccess) 컨텍스트의 접두사에 대한 용어도 볼 수 있지만 의미가 정확히 무엇인지는 분명하지 않습니다. 특정 명령 (다른 명령은 아님)을 사용할 때 접두사로 변수의 이름을 지정하거나 명명 된 변수에 접두사를 추가해야합니까? 귀하의 예제는 var 정의와 var 사용법을 모두 보여주는 첫 번째 예제 이므로 후자를 생각하는 경향이 있습니다! 문서는 거의 도움이되지 않았습니다. 우리가 너무 많이 알고 있다고 가정하고 참조 / 링크가 너무 적습니다.
SherylHohman

5

리디렉션을 만드는 경우 브라우저 캐싱 문제가 발생하지 않도록 curl 로 테스트하십시오 . http 헤더 만 가져 오려면 -I를 사용하십시오. 모든 경로 재 지정을 수행하려면 -L을 사용하십시오.


3

mod_rewrite 문제를 디버깅하는 동안이 질문을 발견했으며 도움이되는 조언이 있습니다. 그러나 결국 가장 중요한 것은 정규식 구문이 올바른지 확인하는 것입니다. 내 자체 RE 구문에 문제가 있기 때문에 regexpCheck.php 스크립트를 설치하는 것은 실행 가능한 옵션이 아닙니다.

그러나 Apache는 PCRE (Perl-Compatible Regular Expressions)를 사용하므로 PCRE 작성을 돕는 모든 도구가 도움이됩니다. 과거에는 RegexPlanet의 도구를 Java 및 Javascript RE와 함께 사용했으며 Perl도 지원한다는 것을 알게되어 기뻤습니다.

정규식과 하나 이상의 예제 URL을 입력하면 정규식이 일치하는지 ( "~ ="열의 "1") 해당하는 경우 일치하는 그룹 ( "분할"의 숫자)이 표시됩니다 열은 각 URL에 대해 Apache가 예상하는 숫자 (예 : $ 1, $ 2 등)에 해당합니다. 그들은 PCRE 지원이 "베타에서"있다고 주장하지만 구문 문제를 해결하는 데 필요한 것입니다.

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

기존 답변에 간단히 의견을 추가했지만 내 평판은 아직 그 수준이 아닙니다. 이것이 누군가를 돕기를 바랍니다.


멋진 도구이지만 끔찍한 양식 ... 다음 멋진 도구를 확인하십시오. regex101.com 또는 refiddle.com 또는 regexr.com
hexerei 소프트웨어

3

4. 관련하여, 모든 재 작성이 완료된 후에도 여전히 "더미 스크립트 스텁"이 실제로 대상 URL인지 확인해야합니다. 그렇지 않으면 아무것도 표시되지 않습니다!

비슷한 / 관련 트릭 ( 이 질문 참조 )은 다음과 같은 임시 규칙을 삽입하는 것입니다.

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

매개 변수 show.php만 표시하는 매우 간단한 스크립트는 어디에 있습니까 $_GET(원하는 경우 환경 변수도 표시 할 수 있음).

디버거의 중단 점처럼 규칙 세트에 삽입 한 시점에서 다시 쓰기가 중지됩니다.

아파치 <2.3.9을 사용하는 경우, 당신은 사용해야합니다 [L]보다는 [END], 당신은 할 수있다 후 추가해야합니다 :

RewriteRule ^show.php$ - [L]

URL 자체를 다시 작성 하는 경우 규칙 세트 맨 위 /show.php.


3

글을 쓸 때 내가 본 몇 가지 실수 .htaccess

의 사용 ^(.*)$, 여러 규칙에 반복적으로 사용^(.*)$ 는 하나의 히트에 URL을 모두 일치하기 때문에, 대부분의 경우 발기 불능으로 원인을 다른 규칙을.

따라서이 URL에 규칙을 사용 sapmle/url하는 경우이 URL도 사용합니다 sapmle/url/string.


[L] 규칙이 처리를 완료 할 수 있도록 플래그를 사용해야합니다.


알아야 할 사항 :

% n과 $ n의 차이

%n중 일치하는 %{RewriteCond}부분 $n에 일치하는 것입니다 %{RewriteRule}부분.

RewriteBase의 작업

RewriteBase 지시문은 상대 경로를 대체하는 디렉토리 별 (htaccess) RewriteRule 지시문에 사용될 URL 접 두부를 지정합니다.

이 지시문은 다음 조건 중 하나라도 해당되지 않는 경우 디렉토리 별 (htaccess) 컨텍스트의 대체에서 상대 경로를 사용할 때 필요합니다.

원래 요청 및 대체는 DocumentRoot 아래에 있습니다 (별칭과 같은 다른 방법으로는 도달 할 수 없음). 상대 대체로 접미사가 붙은 RewriteRule을 포함하는 디렉토리의 파일 시스템 경로는 서버의 URL 경로로도 유효합니다 (드문 경우). Apache HTTP Server 2.4.16 이상에서이 지시문은 Alias ​​또는 mod_userdir을 통해 요청이 맵핑 될 때 생략 될 수 있습니다.


2

.htacesss에 두 줄 이상의 규칙을 작성
하려는 경우 해당 핫픽스를 사용하여 디버깅하는 방법을 생각하지 마십시오.

LOG의 피드백없이 여러 규칙을 설정하는 데 며칠을 낭비하여 마침내 포기했습니다.
내 PC에 Apache를 설치하고 전체 사이트를 HDD에 복사 한 다음 로그를 사용하여 전체 규칙 세트를 정렬했습니다.
그런 다음 작동하던 기존 규칙을 검토했습니다. 나는 그들이 원하는 것을 실제로하고 있지 않은 것을 보았다. 주소가 약간 다른 시한 폭탄.

재 작성 규칙에는 너무 많은 구덩이가 있습니다. 그것은 전혀 논리적 인 것이 아닙니다.
설치하지 않아도 10 분 안에 10MB, 좋은 라이센스, * NIX / WIN / MAC가 준비된 Apache를 10 분 안에 시작할 수 있습니다.
또한 서버의 헤더 행을 확인하고 이전 버전의 아카이브에서 동일한 버전의 Apache를 가져옵니다. 내 영업은 여전히 ​​2.0입니다. 많은 것들이 지원되지 않습니다.


papo, 개발 구조 내에서 전용 서버, ISP 호스팅 VPS 및 개인 VM을 실행했지만 완전히 관리되는 것을 사용하는 것이 더 편리하고 비용 효율적이기 때문에 공용 도메인 및 전자 메일에 대한 공유 호스팅 서비스를 계속 사용합니다. 이것들을위한 서비스. 이 하우투는 실제로 공유 서비스 사용자를 대상으로합니다. 공유 서비스를 완전히 미러링하도록 개인용 VM을 구성하는 것은 어렵습니다. 예. 테스트 VM을 사용하면 도움이되지만 여전히 공유 서비스에서 이러한 "트릭"을 사용합니다.
TerryE

1
귀하의 A가 디버깅 규칙에 대한 대안 제안으로 틀렸다 이것에 동의 할 것입니다 mod_rewrite. 그러나 "생각하지 마십시오"는 htaccess파일 공유 이유를 이해하는 데 어려움을 겪고있는 기본 공유 서비스 사용자에게는 나쁜 조언입니다. 그들이해야하는 방식대로 일하지 마라.
TerryE

훌륭한 조언을 모으는 것이 귀중한 것처럼 들리면 미안합니다. 나는 그것을 원하지 않았다. 나를 믿어, 나는이 스레드가 제공하는 많은 조언을 읽고 따르게되어 매우 기뻤습니다. 그러나 규칙이 천천히 복잡 해졌고 결국 Apache 서버를 설치하고 디버깅을 수행하는 데 어려움을 겪고 싶지 않아 많은 시간을 낭비했습니다. 그 이상으로, 나는 보지 못했듯이 로그에서 실제로 무슨 일이 있었는지 전혀 알지 못했습니다. 그리고 많은 일들이 진행되고 있습니다. 이 경험을 공유하는 것도 가치가 있다고 생각합니다.
papo

두 번째 부분에는 IF가 있습니다. 내 텍스트는 지금도 '생각하지 마라'로 시작한 적이 없습니다.이 단어는 조금 거칠어 보이지만 사실입니다. 특히 이것에 익숙하지 않고 이해하기 힘들어하는 사람들을 위해. 여기에 조언이 나와 같이 내가 필요로하는 모든 것이 확실한 정규 표현식이라고 잘못 안내 할 수 있습니다 .6) PATH_INFO는 많은 비용이 들며 말 그대로 버그가 아니라 기능입니다. 다시 추가하지 않으려면 [DPI]를 사용하십시오. 그러나 로그를 볼 때만 추가되는 것을 볼 수 있습니다. 그렇기 때문에 한 줄 이상을 사용하고 로그를 사용하는 것이 좋습니다.
papo

1
@papo 미안하지만, -1 투표에 대한 나의 이유는 이것이 "생각하지도 않는다"고 나쁜 조언이라고 생각했기 때문입니다. 당신의 요점이 "특정한 복잡성을 넘어 서면, .htaccess파일 을 디버그하기 위해 로컬 아파치 서비스를 설치하는 것이 더 쉽다 "는 것이 더 균형 잡힌 것입니다. 예, 로컬 Apache 서비스를 설정하는 것은 상당히 쉽지만 서비스 제공 업체의 공유 호스팅 서비스를 반영하는 것은 복잡 할 수 있으며 Wordpress의 원 클릭 설정을 사용한 많은 사용자의 기술 수준을 넘어 서면 .htaccess파일에 문제가 있습니다.
TerryE

1

나는 여기에 어쩌면 명백한 세부 사항이를 떠나, 그러나 저 시간 동안 내 머리를 두드리는 가지고 있습니다 : 사용하여 조심 %{REQUEST_URI}무엇 때문에 @Krist 반 Besien는 그의 대답에 말을하는 것은 전적으로 옳다, REQUEST_URI 문자열을하지만 , 이것의 아웃 풋 때문에 TestString은로 시작합니다 /. 따라서주의하십시오 :

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

0

일치하는 내용을 보여주기 위해이 코드를 사용합니다.

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

서버 루트의 r.php에 저장 한 다음 .htaccess에서 몇 가지 테스트를 수행하십시오.
예를 들어 언어 접두어로 시작하지 않는 URL을 일치시키고 싶습니다.

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

1
내 O / P의 포인트 4에서 언급 한 것처럼 phpinfo () 스텁을 사용하면 기본적으로 동일한 작업을 수행합니다. 찾으십시오QUERY_STRING
TerryE

0

@JCastell이 지적한 것처럼 온라인 테스터 는 .htaccess 파일에 대해 개별 리디렉션을 테스트하는 데 효과적입니다. 그러나 더 흥미로운 것은 json 객체를 사용하여 URL 목록을 일괄 테스트하는 데 사용할 수있는 API 노출입니다. 그러나 더 유용하게 만들기 위해 curljq 를 사용 하여 URL 목록을 제출하고 json 응답을 htaccess 파일에서 줄 번호 및 규칙과 일치하는 CSV 형식 출력으로 구문 분석 하는 작은 bash 스크립트 파일 을 작성했습니다. 리디렉션 된 URL과 함께 스프레드 시트의 URL 목록을 비교하고 작동하지 않는 규칙을 신속하게 결정하는 것이 매우 편리합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.