.htaccess로 .php 확장자 제거


101

예, Apache 설명서를 읽고 여기에서 검색했습니다. 어떤 이유로 나는 이것을 작동시킬 수 없습니다. 내가 왔던 가장 가까운 것은 확장자를 제거하는 것이지만 루트 디렉토리를 다시 가리 킵니다. 이 .htaccess파일 이 포함 된 디렉터리에서 작동하기를 원합니다 .

.htaccess파일로 세 가지 작업을해야 합니다.

  1. .php를 제거하는 데 필요합니다.

    ㅏ. 탭을 사용하는 페이지가 여러 개 있고 URL 이 page.php # tab처럼 보입니다. 가능합니까?

    비. URL에 세션 ID를 추가하여 올바른 장소에서 왔는지 확인하는 한 페이지가 있습니다 www.domain.com/download-software.php?abcdefg.

이게 가능해? 또한이 작업에서 헤더 탐색 포함 파일의 링크에서 ".php"를 제거해야합니까? 할까요IE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. 나는 그것을하지 그래서이 모든 URL 앞에 "www가"를 강제하고 싶은 domain.com,하지만 www.domain.com/page.
  2. 페이지에서 모든 후행 슬래시를 제거하고 싶습니다.

나는 계속 찾고, 시도 할 것입니다. 하위 디렉토리에 있으면 문제가 발생합니까?



궁금한데,이게 무슨 혜택일까요? 사용자가 자신이 액세스하는 서버의 파일을 알지 못하도록하는 것입니까?
— Kolob Canyon

두 배. 그래서 그들은 우리가 봉사하고있는 파일 형식 몰라, 그것은 단지 IMO 청소기를 찾습니다
— 더러운 새 디자인

또 다른 관련 질문 : stackoverflow.com/questions/6534904/… .
— Edward

답변:


121

Stack Overflow 질문에 대한 Gumbo의 대답은 Apache mod_rewrite로 .html 확장명을 숨기는 방법 이 제대로 작동합니다.

다시 1) .html을 .php로 변경하십시오.

Re a.) 가능합니다 #tab. URL에 추가 하세요.

Re b.) QSA(Query String Append)를 사용하여 가능 합니다. 아래를 참조하십시오.

이것은 합니다 또한 하위 디렉토리 경로에서 작동 :

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

당신의 도움을 위해 thx, 어떤 이유로 든, 세션이 추가 된 URL이 PHP 파일 (긴 이야기)에 하드 코딩되어 있기 때문에 위의없이 액세스 할 수 있습니다. 도와 주셔서 감사합니다.이 .htaccess 항목은 저에게 까다 롭습니다.
— Dirty Bird Design

8
@Pekka 웃은 [L,공백 QSA]플래그 사이의 공백을 제거합니다 . 그렇지 않으면 500 내부 서버 오류 가 발생합니다.
— Rahil Wazir 2014 년

이 것 /index/bla/bla으로 동일하게index.php
— elkebirmed

/ : 어떤 이유로이 블록 부하에 내 CSS에 대한
— TheCrazyProfessor

! 의미하지 않습니다. 그 규칙은 이미에서 .PHP 종료하지 않는 경우 .PHP 추가 재 작성 말한다
— user339568

72

Apache mod_rewrite

당신이 찾고있는 것은 mod_rewrite입니다 .

설명 : 요청 된 URL을 즉시 재 작성할 수있는 규칙 기반 재 작성 엔진을 제공합니다.

일반적으로 mod_rewrite요청 된 문서를 지정된 정규식과 일치시켜 작업 한 다음 내부적으로 (아파치 프로세스 내에서) 또는 외부 적으로 (클라이언트 브라우저에서) URL 재 작성을 수행합니다. 이러한 재 작성은 내부적으로 example.com/foo를 example.com/foo/bar에 대한 요청으로 번역하는 것처럼 간단 할 수 있습니다.

Apache 문서에는 mod_rewrite가이드가 포함되어 있으며 원하는 작업 중 일부가 여기에 포함되어 있다고 생각합니다. 자세한 mod_rewrite 가이드 .

www하위 도메인 강제

모든 URL 앞에 "www"를 강제하고 싶습니다. domain.com이 아니라 www.domain.com/page입니다.

재 작성 안내서에는 Canonical Hostname 예제에 대한 지침이 포함되어 있습니다.

후행 슬래시 제거 (1 부)

페이지에서 모든 후행 슬래시를 제거하고 싶습니다.

재 작성 가이드에는 정반대에 대한 예가 포함되어 있습니다 . 즉, 항상 후행 슬래시를 포함하므로 왜 이렇게해야하는지 잘 모르겠습니다 . 문서는 후행 슬래시를 제거하면 문제를 일으킬 가능성이 크다고 제안합니다.

후행 슬래시 문제

기술:

모든 웹 마스터는 디렉토리를 참조하는 URL에서 후행 슬래시 문제에 대한 노래를 부를 수 있습니다. 누락 된 경우 서버는 오류를 덤프합니다. /~quux/foo대신 말하면 /~quux/foo/ 서버가 foo라는 파일을 검색하기 때문입니다. 그리고이 파일은 디렉토리이기 때문에 불평합니다. 실제로 대부분의 경우 자체적으로 수정하려고 시도하지만 때로는이 메커니즘을 사용자가 에뮬레이션해야합니다. 예를 들어 CGI 스크립트 등에 복잡한 URL 재 작성을 많이 한 후에

왜 항상 후행 슬래시를 제거하고 싶은지 확장 할 수 있습니까?

.php확장 제거

.php를 제거하는 데 필요합니다.

내가 생각할 수있는 가장 가까운 일은 모든 요청 문서를 내부적으로 .php 확장자로 다시 작성하는 것입니다. 즉, example.com/somepage는 대신 example.com/somepage.php에 대한 요청으로 처리됩니다. 이 방식으로 진행하려면 각 페이지가 실제로 파일 시스템에 somepage.php로 존재해야합니다.

정규 표현식의 올바른 조합으로 어느 정도 가능할 것입니다. 그러나 색인 페이지가 올바르게 요청되지 않고 디렉토리와 올바르게 일치하지 않는 몇 가지 가능한 문제를 예견 할 수 있습니다.

예를 들어, example.com/test.php에 대한 요청으로 example.com/test를 올바르게 다시 작성합니다.

RewriteEngine  on
RewriteRule ^(.*)$ $1.php

그러나 example.com/.php가 없기 때문에 example.com이로드되지 않습니다.

후행 슬래시를 모두 제거하면 상위 디렉토리의 파일 이름 요청에서 디렉토리 색인 요청을 선택하는 것이 거의 불가능할 것이라고 추측 할 것입니다. 'foobar'디렉토리에 대한 요청을 어떻게 결정합니까?

example.com/foobar

foobar (실제로는 foobar.php)라는 파일에 대한 요청에서

example.com/foobar

RewriteBase지시문 을 사용하면 가능할 수 있습니다 . 그러나 그렇게하면 RewriteCond요청이 디렉토리 나 파일에 매핑되는지 파일 시스템 수준 검사를 수행 하기 위해 지시문이 필요 하므로이 문제는 훨씬 더 복잡해집니다 .

즉, 모든 후행 슬래시를 제거해야한다는 요구 사항을 제거하고 대신 후행 슬래시를 강제 추가하면 ".php 확장자 없음"문제가 좀 더 합리적입니다.

# Turn on the rewrite engine
RewriteEngine  on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]

이것은 여전히 ​​완벽하지 않습니다 . 파일에 대한 모든 요청에는 여전히 내부적으로 요청에 .php가 추가되어 있습니다. 'hi.txt'를 요청하면 오류 로그에 다음과 같이 기록됩니다.

[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat

그러나 다른 옵션 이 있습니다. 다음과 같이 DefaultType및 DirectoryIndex지시문을 설정하십시오 .

DefaultType application/x-httpd-php
DirectoryIndex index.php index.html

2013-11-14 업데이트-nicorellius의 관찰을 통합하도록 위의 스 니펫을 수정했습니다.

이제 hi.txt (및 기타)에 대한 요청이 성공하고 example.com/test에 대한 요청이 처리 된 test.php 버전을 반환하며 index.php 파일이 다시 작동합니다.

이 솔루션에 대한 크레딧을 제공해야합니다. Google에서 php no extension apache 를 검색 하여 Michael J. Radwins 블로그 를 찾았습니다 .

후행 슬래시 제거

일부 검색은 apache remove trailing slashes일부 검색 엔진 최적화 페이지 를 가져 왔습니다. 분명히 일부 콘텐츠 관리 시스템 (이 경우 Drupal)은 URls에서 후행 슬래시를 사용하거나 사용하지 않고 콘텐츠를 사용할 수있게하여 SEO 세계에서 사이트에 중복 콘텐츠 패널티를 부과합니다. 출처

해결책은 mod_rewrite요청 된 리소스가 a로 끝나는 조건에서 /다시 작성하고 301 Permanent RedirectHTTP 헤더를 다시 전송하여 URL을 다시 작성하는 것을 사용하여 매우 사소한 것처럼 보입니다 .

다음은 도메인이 blamcast.net이라고 가정하고 요청에 선택적으로 접두사가 붙도록 허용하는 그의 예입니다 www..

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

이제 우리는 어딘가에 있습니다. 모두 모아서 어떻게 생겼는지 봅시다.

필수 www., no .php및 후행 슬래시 없음

이것은 도메인이 foobar.com이고 표준 포트 80에서 실행 중이라고 가정합니다.

# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html

# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST}   !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST}   !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*)         http://www.foobar.com/$1 [L,R,NE]

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

'R'플래그는 RewriteRule지시문 섹션에 설명되어 있습니다. 단편:

redirect|R [=code](강제 리디렉션) http://thishost[:thisport]/외부 리디렉션을 강제하기 위해 (새 URL을 URI로 만드는 ) 접두사 대체 . 코드가 제공되지 않으면 302 ( MOVED TEMPORARILY ) 의 HTTP 응답 이 반환됩니다.

최종 참고

슬래시 제거를 성공적으로 수행 할 수 없었습니다. 리디렉션으로 인해 무한 리디렉션 루프가 발생했습니다. 원래 솔루션을 자세히 읽은 후 Drupal 설치가 구성되어 있기 때문에 위의 예제가 작동한다는 인상을 받았습니다. 그는 구체적으로 다음과 같이 언급합니다.

일반 Drupal 사이트에서 깨끗한 URL이 활성화 된 상태에서이 두 주소는 기본적으로 상호 교환이 가능합니다.

슬래시가 있거나없는 URL을 참조합니다. 더욱이,

Drupal은라는 파일을 사용 .htaccess하여 웹 서버에 URL을 처리하는 방법을 알려줍니다. 이것은 Drupal의 깨끗한 URL 마법을 가능하게하는 동일한 파일입니다. .htaccess파일 시작 부분에 간단한 리디렉션 명령을 추가 하면 서버가 후행 슬래시를 자동으로 제거하도록 강제 할 수 있습니다.


와우 감사합니다. 실제로 나는 그것을 작동시킬 수 있었고, 내 서버에 내가 변경해야 할 이상한 것들이 있다는 것이 밝혀졌습니다. 어쨌든, 이제 다음 문제로 넘어 가서 하나를 제외한 모든 페이지에서 .php를 제거하십시오. thx man
— Dirty Bird Design

잘 생각하고 체계적인 답변을 보는 것을 좋아합니다. 수고하셨습니다 ... 내가 알아 차린 한 가지는 : 당신은 의미 DirectoryIndex index index.html했습니까? 또는 DirectoryIndex index.php index.html?
— nicorellius 2013

@nicorellius는 당신이 옳다고 믿습니다. 나는 당신의 관찰로 나의 원래 대답을 업데이트했습니다.
— Tim Bielawa

이것이 항상 효과가있는 것은 아닙니다. 아래 답변을 시도해보십시오 (사용자 1079877)
— DonJoe

당신은 진정한 MVP입니다.
— ZainZaheer06

45

위의 다른 답변 외에도

파일에서 .php 확장자를 완전히 제거하고 무한 루프 를 피하기 위해이 방법을 시도 할 수도 있습니다 .

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

이 코드는 Root / .htaccess에서 작동합니다. 하위 디렉토리의 htaccess 파일에 저장하려면 RewriteBase를 변경해야합니다.

편집하다 :

Apache 2.4 이상에서는 END 플래그를 사용하여 무한 루프 오류를 방지 할 수도 있습니다. 다음 예제는 apache 2.4에서 위와 동일하게 작동합니다.

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]

10
안녕하세요, 감사합니다. .php를 자르기 위해 많은 솔루션을 시도했지만 이것이 올바르게 작동했습니다. :)
— beamkiller

4
감사! 이 수정은 어디에서 그 아파치 2.4, 무한 루프 아파치 2.5 단부까지 (그리고 것이다 500) [END] 슈퍼 중요
— 제이크 Bolam

23

다음 코드는 저에게 잘 작동합니다.

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php

이것은 example.com이 모든 파일과 디렉토리의 색인으로 바뀌는 것을 제외하고는 작동합니다. (Apache 2.4)
— earth2jason 2014 년


10

(Debian 8) 에서 매개 변수를 AllowOverride에서 None로 변경 한 후 .htaccess 파일에 다음 이 포함되어야합니다.All/etc/apache2/apache2.conf

Options +MultiViews
AddHandler php5-script php
AddType text/html php

그리고 파일에서 .php 확장자를 숨기는 것으로 충분했습니다.


이것이 더 높기를 바랍니다. MultiViews이것이 바로 할 때 URL 재 작성의 오버 헤드로 귀찮게하는 이유
— Phil

이것은 훌륭합니다. 단점이 있습니까?
— 개정

@ 개혁 감사합니다. 나는에서 변경 링크를 가지고 <a href="somepage.php">링크 </a>로 <a href="somepage">링크 </a>소스 코드
— 로드니 살 세도에게

8

이 시도
다음 코드를 작업은 확실히

RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

5

다른 답변이 왜 작동하지 않았는지 확실하지 않지만 내가 찾은이 코드는 다음과 같습니다.

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

그게 내 htaccess에있는 전부이며 example.com/page는 example.com/page.php를 보여줍니다.


4

PHP 파일에서 .php 확장자를 제거하려면 (예 : yoursite.com/about.php to yoursite.com/about) 다음 단계를 따르십시오. 웹 사이트의 루트에서 .htaccess (존재하지 않는 경우 새로 생성) 파일을 열고 다음 코드를 추가합니다.

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

html 파일에서 .html 확장자를 제거하려면 (예 : yoursite.com/about.html to yoursite.com/about) 다음 단계를 따르십시오.

웹 사이트의 루트에서 .htaccess (존재하지 않는 경우 새로 생성) 파일을 열고 다음 코드를 추가합니다.

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

참조 : URL에서 PHP 확장을 제거하는 방법


1
내가 필요한 유일한 대답. 감사! :)
— MatrixCow08

2

PHP로 코딩 중이고 .php를 제거하려면 다음과 같은 URL을 사용할 수 있습니다.

http://yourdomain.com/blah- > /blah.php를 가리키는

이것이 필요한 전부입니다.

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

2

100 % 작동하는 개념을 찾았습니다.

# Options is required by Many Hosting
Options +MultiViews

RewriteEngine on

# For .php & .html URL's:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1.html [NC,L]

다음과 같이 웹 사이트 .htaccess 파일의 루트에서이 코드를 사용하십시오.

오프라인-wamp \ www \ YourWebDir

온라인-public_html /

제대로 작동하지 않으면 Wamp 서버의 설정을 변경하십시오. 1) WAMP 아이콘을 왼쪽 클릭하십시오. 2) Apache 3) Apache 모듈 4) rewrite_module을 왼쪽 클릭하십시오.


서로 옆에 RewriteRule태그 가있는 두 개의를 가질 수 없습니다 L. 지정된에 대한 마지막 규칙임을 [L]알려줍니다 . mod_rewriteRewriteCond
— MD XF

2

.php파일 이름 에서 확장명 을 숨기는 데 사용한 코드는 다음과 같습니다 .

## hide .php extension
# To redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L,NC]

참고 : R=301영구 리디렉션 용이며 SEO 용도로 사용하는 것이 좋습니다. 그러나 임시 리디렉션을 원하면R


2

다음 작업 코드로 끝났습니다.

RewriteEngine on 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

1

같은 PHP에서 URL을 경우 http://yourdomain.com/demo.php는 보다처럼 제공 http://yourdomain.com/demo

이것이 필요한 전부입니다.

.htaccess 파일 생성

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

작동 http://example.com/myfile 했지만 http://example.com/myfolder/(색인 파일) 에서는 작동하지 않았습니다 . 색인 파일에서 작동하도록 도와 줄 수 있습니까?
— Wesley Gonçalves

위의 @starkeen 응답 URL을 시도해야한다고 생각합니다 : stackoverflow.com/a/30566026/3786343
— Kamlesh

1

시험

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L] 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.