다음 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/username
GET 사용자 이름을 입력하면 다음과 같이 에코됩니다.
username.php
모든 방법을 시도했지만 해결 방법을 찾을 수 없습니다.
도움을 주시면 감사하겠습니다.
답변1
www.example.com/username
GET 사용자 이름을 입력하면 다음과 같이 에코됩니다.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,})$
.