문제

StackoverFlow와 같은 페이지 확장을 숨기고 싶습니다. 다음은 어떻게 작동합니까?

http://stackoverflow.com/tags/foo
http://stackoverflow.com/tags/bar

나는 이것을하는 많은 사이트를 보았지만 여전히 이것이 어떻게 달성되는지 모르겠습니다 (램프 스택이 있습니다).

도움이 되었습니까?

해결책

웹 서버가 URL에 대한 요청을 받으면 처리 방법을 결정해야합니다. 고전적인 방법은 URL의 헤드를 파일 시스템의 디렉토리에 매핑 한 다음 나머지 URL이 파일 시스템의 파일로 이동하도록하는 것이 었습니다. 결과적으로 URL에는 파일 확장이있었습니다.

그러나 그렇게 할 필요가 없으며 대부분의 새로운 웹 프레임 워크는 그렇지 않습니다. 그들은 프로그래머가 실행할 코드를 매핑하는 방법을 정의하게하므로 응답을 제공하는 단일 파일이 없기 때문에 파일 확장자가 필요하지 않습니다.

예에서는 "foo"및 "bar"파일을 포함하는 "태그"디렉토리가 없습니다. "Tags"URL은 TAG 데이터의 데이터베이스에 대한 쿼리의 매개 변수로 나머지 URL ( "foo"또는 "bar")을 사용하는 코드에 매핑됩니다.

다른 팁

원하는 것은 깨끗한 URL이며 Apache 및 .htaccess로 수행 할 수 있습니다. 더 나은 방법이있을 수 있지만 여기에 내가하는 방법은 다음과 같습니다.

http://evolt.org/making_clean_urls_with_apache_and_php

그것이 아름다움과 작품입니다 ASP.NET MVC.

없음 "숨기기" - ASP.NET MVC가 URL을 처리하고 해당 "경로"를 컨트롤러 클래스의 컨트롤러 작업에 매핑하는 방식입니다.

"클래식"ASP.NET WebForms의 방식에서 벗어나는 큰 단계입니다.

Apache+PHP에 따라이를 수행하는 몇 가지 방법이 있지만 필수 원칙은 URI 세트 (아마도 모든 URI, 사이트에 따라 모든 URI를 사용하지만 사이트의 다른 부분을 처리하기 위해 다른 스크립트를 원할 수 있음) 번역하는 것입니다. 단일 PHP 파일로, 사용자가 요청한 객체를 들었습니다.

개념적으로 단순한 방법은 모든 URL을 스크립트로 다시 작성하는 것입니다. $_SERVER['REQUEST_URI'] 좋아하는대로 해석합니다.

URI 재 작성은 mod_rewrite, mod_alias 및 errordocument를 포함한 다양한 방법으로 수행 할 수 있습니다 (Apache Docs 참조).

또 다른 방법은 더 복잡한 URL 재 작성 (아마도 mod_rewrite 사용)을 설정하여 경로를 Get 변수로 추가하는 것입니다.

또한 있습니다 $_SERVER['PATH_INFO'] 로드 된 변수 존재하지 않는 경로의 일부. 이 옵션은 Apache Config 파일에 대한 수정이 거의 없거나 전혀 필요하지만 URL의 유연성을 약간 줄입니다.

최신 웹 개발 프레임 워크는 우아한 URL을 지원합니다. 체크 아웃 장고 또는 루비 on 레일.

Apache를 사용하고 있고 단순히 정적 HTML 파일의 파일 확장을 숨기고 싶다면이를 사용할 수 있습니다. .htaccess 암호:

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f       # if the requested URL is not a file that exists
RewriteCond %{REQUEST_FILENAME} !-d       # and it isn't a directory that exists either
RewriteCond %{REQUEST_FILENAME}\.html -f  # but when you put ".html" on the end it is a file that exists
RewriteRule ^(.+)$ $1\.html [QSA]         # then serve that file

</IfModule>

아파치 mod_rewrite "부

실제 .htaccess 몇 개의 사이트에서 사용하는 코드는 그렇지 않지만 동일하지는 않습니다.

<IfModule mod_rewrite.c>
    RewriteEngine on

    #RewriteRule ^$ index.php [QSA]
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.+)$ $1\.php [QSA]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)$ index.php/$1 [QSA]

</IfModule>

그리고 여기 Zeus 서버에서 동일한 작업을 수행하는 데 훨씬 길지만 훨씬 더 읽기 쉬운 코드가 있습니다. 제우스에서는 호출됩니다 rewrite.script.

# http://drupal.org/node/46508


# get the document root
map path into SCRATCH:DOCROOT from /
# initialize our variables
set SCRATCH:ORIG_URL = %{URL}
set SCRATCH:REQUEST_URI = %{URL}

match URL into $ with ^(.*)\?(.*)$
if matched then
  set SCRATCH:REQUEST_URI = $1
  set SCRATCH:QUERY_STRING = $2
endif

# prepare to search for file, rewrite if its not found
set SCRATCH:REQUEST_FILENAME = %{SCRATCH:DOCROOT}
set SCRATCH:REQUEST_FILENAME . %{SCRATCH:REQUEST_URI}

# check to see if the file requested is an actual file or
# a directory with possibly an index.  don't rewrite if so
look for file at %{SCRATCH:REQUEST_FILENAME}
if not exists then
  look for dir at %{SCRATCH:REQUEST_FILENAME}
  if not exists then
    look for file at  %{SCRATCH:REQUEST_FILENAME}.php
    if exists then
        set URL = %{SCRATCH:REQUEST_URI}.php?%{SCRATCH:QUERY_STRING}
    else
        set URL = /index.php/%{SCRATCH:REQUEST_URI}?%{SCRATCH:QUERY_STRING}
    endif
  endif
endif
goto END
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top