2017-12-19 15 views
3

URL을 정리하고 .php 확장자를 삭제하려고합니다. 나는 웹 사이트의 기본 폴더에 있으므로 우선 순위 등을 취할 수있는 상위 .htaccess 파일이 없습니다. 여기에 내 htaccess 코드가 있습니다..htaccess url 파일 이름이 ext 인 경우 다시 쓰기 동작을 덮어 씁니다. URL과 동일

이 부분은 어떤 동작이 덮어 쓰여지 든간에 같은 방식으로 동작하므로 실제 문제는 없습니다. 그러나이 다른 줄에 URL 변수를 추가하여 URL 변수를 설명하면

RewriteRule ^give/([0-9]+)/?$ give.php?step=$1 [NC,L] 

완전히 무시됩니다. 그러나 give.php의 이름을 다른 것으로 변경하면 url과 일치하지 않으므로 작동합니다. 예를 들어, given.php를 사용하면 .htaccess 규칙에 유의해야합니다. 나는 전에이 문제를 다뤄 본 적이 없다. 내가 변경할 수있는 서버 설정이있어서 내 파일에 이상한 이름을 줄 필요가 없습니까?

다른 파일로 리디렉션하기 위해 첫 번째 줄을 변경했지만 실제 파일 이름은 give.php로 변경하지 않았습니다. 리디렉션을 무시하고 여전히 give.php 파일을로드했습니다.

편집 : 두 규칙의 순서를 변경해 보았습니다. 두 규칙을 모두 주석으로 작성한 다음 다른 규칙이 서로 충돌하는지 확인해 보았습니다. 내가 생각할 수있는 최고의 서버는/give/exists 디렉토리가 없으면 /give.php를 지시/부여/전달하는 일종의 기본 동작을합니다. 왜냐하면 두 규칙을 제거하더라도 /giving/php/gig.php로 이동하기 때문입니다. 파일 이름을 given.php로 변경했을 때만 기본 동작이 중단됩니다.

RewriteRule ^give/?$ resources.php [NC,L] 

그리고 한 파일 give.php 존재로, 여전히 give.php로 리디렉션 : 나는이에 간단한 규칙을 설정했습니다. give.php를 제거하거나 이름을 바꾼 경우 /로 이동하면 resources.php로 리디렉션됩니다.

답변

2

MultiViews 옵션이 mod_negotiation 인 경우 충돌이 발생할 수 있습니다. 귀하의 요청이 RewriteRule에 전혀 부딪치지 않았을 수 있으며, 대신 으로 인해 give.php에 의해 처리되고 있습니다. the docs에서 :.

... /some/dir은 MultiViews를 활성화 있으며, /some/dir/foo이 존재하지 않는 경우 서버가 /some/dir/foo에 대한 요청을 수신하는 경우, 서버는 foo에 이름이 지정된 파일을 찾는 디렉토리를 읽고 * 효과적으로 가짜 모든 파일의 이름을 지정하는 유형 맵을 작성하여 클라이언트가 이름으로 요청한 것과 동일한 미디어 유형과 내용 인코딩을 할당합니다. 그런 다음 고객의 요구 사항에 가장 잘 맞는 것을 선택합니다.

에 한번 당신의 .htaccess이를 추가하고 일을 변경하는 경우 참조 :

Options -MultiViews 
+1

내 문제가 해결되었습니다. 감사! – AdamMasters

0

그래서 일부 변경, 처음에는 규칙 전에 일부 파일 상태를 시도 할 것입니다. 두 번째 매개 변수는 숫자에 대해서만 쓰고, 더 많은 쿼리에 대해서는 마지막 QSA입니다.

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule ^give/(.+)$ give.php?step=$1 [QSA, L]