htaccess가 url.php로 리디렉션됨

htaccess가 url.php로 리디렉션됨

다음 URL을 원했습니다. www.example.com/userprofile.php?username=username 아래 www.example.com/username
는 내 htaccess 파일입니다.

Options All -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1index [NC,L]
RewriteRule ^([^\.]+)$ $1login [NC,L]
RewriteRule ^(.*)$ userprofile.php?username=$1 [QSA]

www.example.com/usernameGET 사용자 이름을 입력하면 다음과 같이 에코됩니다.

username.php

모든 방법을 시도했지만 해결 방법을 찾을 수 없습니다.
도움을 주시면 감사하겠습니다.

답변1

www.example.com/usernameGET 사용자 이름을 입력하면 다음과 같이 에코됩니다.username.php

파일의 앞 부분에 다시 작성한 내용이 있기 때문입니다.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

/username(기존 파일에 매핑되지 않는 요청)을 다시 작성합니다 ./username.php ~ 전에이것을 userprofile.php?username=username.php. 따라서 접미사가 포함된 GET 매개변수 값이 표시되는 이유는 무엇입니까 .php?

RewriteRule마찬가지로, 이전 규칙이 요청을 포착하고 있으므로 다음 두 지시문은 현재 아무 작업도 수행하지 않습니다.

RewriteRule ^([^\.]+)$ $1index [NC,L]
RewriteRule ^([^\.]+)$ $1login [NC,L]

그리고 확장자를 추가하기 위해 이전 재작성을 수정하는 경우 이는 "사용자 이름" 재작성과만 충돌합니다 .php. 그러나 또한 이 두 규칙은 서로 충돌합니다. 동일한 URL을 두 규칙과 일치시키고 있으므로 첫 번째 규칙이 항상 승리합니다. (하나의 입력과 두 개의 서로 다른 출력은 어떤 시나리오에서도 가능하지 않습니다.) 실제로 이로 인해 재작성 루프가 생성될 가능성이 높습니다.

이 두 지시어는 제거되어야 합니다.


.php에 추가되는 것을 방지하려면 파일이 존재하는지 username확인할 수 있습니다..php~ 전에그것에 다시 쓰기. 예를 들어:

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

하지만 사용자 이름이 구체적으로 명시된 URL을 쉽게 타겟팅할 수 있도록 URL 구조를 변경하는 것도 고려해 보겠습니다. 예를 들어:

www.example.com/u/username

그러면 지시어를 덜 모호하게 작성할 수 있습니다(그리고 파일의 지시어 순서에 크게 의존하지 않습니다).

RewriteRule ^u/(.*)$ userprofile.php?username=$1 [QSA,L]

또한 사용자 이름을 캡처하는 정규식을 더 구체적으로 작성하세요. 패턴이 .*포착된다아무것. 예를 들어 사용자 이름에 a..z 문자만 포함될 수 있는 경우 와 같은 정규식을 사용하세요 ^u/([a-z]+)$. 사용자 이름이 4자 이상이어야 하는 경우: ^u/([a-z]{4,})$.

관련 정보