2011-01-03 4 views
1

내 페이지에있는 모든 URL은 내 페이지에 http://domain.com/page/, 확장자는 없지만 뒤에 슬래시가있는 것입니다. 사용자가 http://domain.com/page 또는 http://domain.com/page.php으로 작성하면 첫 번째 URL로 리디렉션됩니다. 일부 인터넷 검색 후 나는이 코드를 발견하고 작동에 가까운, 그러나 당신이 당신의 요청에 후행 슬래시를 떠날 때 URL은 http://domain.com/Users/"..."/page/ 같은 것을되고 그에은 404 내 htaccess로는 다음과 같습니다 반환htaccess와 함께 슬래시를 추가하면 절대 경로가됩니다.

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php 
RewriteRule (.*)\.php$ /$1/ [L,R=301] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule (.*)/$ $1.php [L] 

RewriteCond %{REQUEST_FILENAME} !(.*)/$ 
RewriteRule (.*)/$ $1.php [L] 

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule .*[^/]$ $0/ [L,R=301] 

추가 규칙을 추가하려고 시도했지만 실제로이 중 하나를 얻지 못해 어떤 답변도 찾을 수 없었습니다.

답변

2

이와 같은 시나리오의 경우 브라우저 URL 표시 줄과 웹 서버가 반환/실행해야하는 파일을 모두 고려해야합니다. 또한 각 외부 리디렉션은 다시 쓰기 지시문의 처리를 시작합니다. 그걸 염두에두고

, URL이 올바른 형식 일 경우 파일이 반환되는 처리 복용하여 시작합니다 [R=301]로 리디렉션하여 후행 슬래시가 URL을 처리, 그리고

RewriteEngine on 

RewriteRule ^/?$ /index.php [L] 
RewriteRule ([^./]+)/$ /$1.php [L] 

을 :

이러한 두 가지 규칙 제는 (something.php 등) 파일명 아니라 파일 확장명을 제거하고 슬래시 재 첨가함으로써 슬래시가있는 경우에주의를 기울여야한다는
RewriteRule ^/(.*)\.[^.]*$ http://www.example.com/$1/ [R=301,L] 
RewriteRule ^/(.*)$ http://www.example.com/$1/ [R=301,L] 

참고.

내부 디렉토리 구조가 웹 서버가 제공하는 것과 일치하지 않는 경우 (종종 공유 호스팅 시나리오 에서처럼) 지시어 바로 뒤에 RewriteBase 지시문을 추가해야 할 수 있습니다. 설명은 See the Apache docs입니다.

+0

글쎄, 저도 도와 줬어! –

+0

앤드류, 도와 줘서 고마워! 그것은 매우 깔끔하게 보이고 논리를 따르지 만 실제로 파일 확장자 나 후행 슬래시를 사용할 때 올바른 파일에 액세스하게 만듭니다. 어떤 확장자도 제거하지 않고 그 뒤에 슬래시를 추가하지 않습니다. 실제로 후행 슬래시를 사용하지 않을 때 404를 반환합니다. – Fredrik

+0

@Fredrik URL의 * 확장자를 제거 하시겠습니까? 그렇다면 내부적으로 .php를 추가 할 계획입니까? 예를 들어 http://www.example.com/something.html에서 브라우저를 http://www.example.com/something/으로 리디렉션하고 싶다면 요청을 처리하기 위해 내부적으로 something.php를 사용하고 싶습니까? – Andrew

관련 문제