.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

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

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.