![.htaccess 문제 php $_SERVER['PATH_INFO']가 비어 있습니다.](https://rvso.com/image/756877/.htaccess%20%EB%AC%B8%EC%A0%9C%20php%20%24_SERVER%5B'PATH_INFO'%5D%EA%B0%80%20%EB%B9%84%EC%96%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
.htaccess
로컬 호스트에서 내 파일 의 다음 규칙에 따라 PHP(MVC) 애플리케이션을 실행하고 있었습니다 .
Options -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^(config|core|css|js|fonts|images|robots\.txt)
RewriteRule ^(.+)$ index.php/$1 [L]
예를 들어 localhost/myapp/register/login
로그인 페이지를 로드합니다. 하지만 라이브 서버에서는 문제가 있습니다. 내가 직면한 첫 번째 문제는 No input file specified
. 독서이 답변나는 이 줄 RewriteRule ^(.+)$ index.php/$1 [L]
을 RewriteRule ^(.*)$ index.php?/$1 [L]
. 이로 인해 첫 번째 문제가 해결되었지만 또 다른 문제가 발생하여 이제 URL이 무엇이든 항상 동일한/기본 보기 및 컨트롤러가 로드됩니다.
내 index.php에는 다음과 같은 코드 줄이 있습니다.
$url = isset($_SERVER['PATH_INFO']) ? explode('/', ltrim($_SERVER['PATH_INFO'], '/')) : [];
// Route the request
Router::route($url);
그래서 $_SERVER['PATH_INFO'] 값을 확인했는데 비어 있습니다. 이제 내 질문은 그것이 비어 있는 이유와 URL의 정상적인 동작을 어떻게 달성할 수 있는지입니다.
답변1
마침내 나는 그것을 작동하게 만들었습니다. 내 새로운
RewriteRule
것은 입니다RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
.$_SERVER['REQUEST_URI']
내 .$_SERVER['PATH_INFO']
index.php
PHP 코드에서 을 사용하는 경우 $_SERVER['REQUEST_URI']
쿼리 문자열(URL 경로 포함)을 추가하면 안 됩니다.RewriteRule
치환(적어도 넌 그렇지 않아필요), 즉. 대신에 간단히 사용하세요 RewriteRule . index.php [L]
.
PHP $_SERVER['REQUEST_URI']
슈퍼글로벌에는 지시문에 관계없이 요청된 URL 경로만 포함됩니다 RewriteRule
. 여기에는 잠재적인 쿼리 문자열도 포함되어 있습니다(엄밀히 말하면 PHP 코드에서 분할해야 할 수도 있음). (URL 경로만 포함하는 동일한 이름의 Apache 서버 변수와는 다릅니다.)
대신 "changed" 에서와 같이 쿼리 문자열을 전달하기로 선택한 경우 RewriteRule
슬래시 접두사를 추가할 필요가 없는 것 같습니다(PHP 코드에서 이를 제거하므로). 예를 들어:
RewriteRule (.*) index.php?$1 [QSA,L]
그러면 index.php
다음과 같은 결과가 나타납니다.
$url = !empty($_SERVER['QUERY_STRING']) ? explode('/',$_SERVER['QUERY_STRING']) : [];
참고하세요$_SERVER['QUERY_STRING']
로언제나!empty()
설정되므로 가 아닌 을 확인해야 합니다 isset()
.