찾다
Q&A 설명: mod_rewrite 이해, URL 재작성 및 "예쁜 링크" 생성

0

"예쁜 링크"는 자주 요청되는 주제이지만 완전히 설명되는 경우는 거의 없습니다. mod_rewrite는 "예쁜 링크"를 만드는 한 가지 방법이지만 복잡하고 구문이 매우 간결하고 이해하기 어렵고 문서에서는 HTTP에 어느 정도 익숙하다고 가정합니다. "예쁜 링크"가 작동하는 방식과 mod_rewrite를 사용하여 링크를 만드는 방법을 간략하게 설명해 줄 수 있는 사람이 있습니까?

기타 일반 이름, 별칭, 일반 URL에 대한 용어: RESTful URL, 사용자 친화적인 URL, SEO 친화적인 URL, 슬러깅 및 MVC URL(잘못된 이름일 수 있음)

Your Answer
제출하다

2 답변
0

deceze의 답변을 확장하기 위해 다른 mod_rewrite 기능에 대한 몇 가지 예와 설명을 제공하고 싶습니다. p>

아래의 모든 예는 귀하가 이미 .htaccess 文件中包含 RewriteEngine On에 있다고 가정합니다.

예제 다시 작성

예를 들어보겠습니다:

으아아아

이 규칙은 4가지 부분으로 나누어져 있습니다:

  1. RewriteRule - 규칙 재작성 시작
  2. ^blog/([0-9]+)/([A-Za-z0-9-+]+)/?$ - 이것을 패턴이라고 부르지만 저는 그냥 규칙의 왼쪽이라고 부르겠습니다 - 재정의하고 싶은 것
  3. blog/index.php?id=&title= - 대체라고 함, 또는 다시 쓰기 규칙의 오른쪽 - 다시 쓰고 싶은 것
  4. [NC,L,QSA] 쉼표로 구분된 규칙 재작성 플래그입니다. 나중에 자세히 설명하겠습니다

위를 다시 작성하면 /blog/1/foo/와 같은 콘텐츠에 대한 링크를 허용할 수 있으며 실제로 /blog/index.php?id=1&title=foo代码>.

가 로드됩니다.

규칙의 왼쪽

  • ^ 表示页面名称的开头 - 因此它将重写 example.com/blog/... 但不会重写 example.com/foo/博客/...^는 페이지 이름의 시작 부분을 나타냅니다. 따라서
  • example.com/blog/...는 다시 작성되지만
  • example.com/foo/blog/...(…)
    • (…) 괄호 세트는 정규식을 나타내며, 규칙 오른쪽에 있는 변수로 캡처할 수 있습니다. 이 예에서는 다음과 같습니다. ([0-9]+) - 匹配长度至少为 1 个字符且仅包含数字值(即 0-9)的字符串。这可以通过规则右侧的
    • 첫 번째 대괄호 세트 -
    • ([0-9]+) - 길이가 1자 이상이고 숫자 값(예: 0-9)만 포함하는 문자열과 일치합니다. 이는 규칙 오른쪽의 -+ code> (注意 + 用反斜杠转义,因为如果不转义它,这将作为 正则表达式重复字符)。这可以通过规则右侧的 $1를 통해 참조할 수 있습니다
    두 번째 대괄호 세트는 영숫자(A-Z, a-z 또는 0-9),
  • - 또는
  • +만 포함하는 길이가 1자 이상인 문자열과 일치합니다(참고 ? 表示前面的字符是可选的,因此在本例中 /blog/1/foo//blog/1/foo+는 백슬래시로 이스케이프됩니다. 왜냐하면 이스케이프하지 않으면 정규식 반복 문자
  • )로 실행되기 때문입니다. 이는 규칙 오른쪽의
  • $2를 통해 참조할 수 있습니다$

?는 앞의 문자가 선택 사항임을 의미하므로 이 경우

/blog/1/foo code>는 동일한 위치에 다시 작성됩니다

$는 이것이 일치시키려는 문자열의 끝이라는 의미입니다/blog/1/foo//BLOG/1/ foo/

🎜로고🎜 🎜이러한 옵션은 특정 조건을 지정하기 위해 다시 쓰기 규칙 끝에 대괄호 안에 추가됩니다. 다시 말하지만, 🎜 문서에서 다양한 플래그 🎜에 대해 읽을 수 있지만 더 일반적인 플래그 중 일부를 다루겠습니다. 🎜 으아아아 🎜caseless 플래그는 다시 쓰기 규칙이 대소문자를 구분하지 않음을 의미합니다. 따라서 위의 예시 규칙에서는 🎜 및 🎜/BLOG/1/foo/(또는 그 변형)가 일치함을 의미합니다. 🎜으아아아

마지막 플래그는 이것이 처리되어야 하는 마지막 규칙임을 나타냅니다. 이는 이 규칙이 일치하는 경우에만 현재 재작성 처리 실행에서 더 이상 규칙이 평가되지 않음을 의미합니다. 규칙이 일치하지 않으면 다른 모든 규칙은 평소대로 시도됩니다. L 플래그를 설정하지 않으면 모든 후속 규칙이 다시 작성된 URL에 적용됩니다.

으아아아

Apache 2.4부터는 [END] 플래그를 사용할 수도 있습니다. 이에 일치하는 규칙은 [END] 标志。与之匹配的规则将完全终止进一步的别名/重写处理。 (而 [L]완전히

추가 앨리어싱/재작성 처리를 종료합니다. (그리고 [L] 플래그는 일반적으로 하위 디렉터리를 다시 쓰거나 하위 디렉터리를 다시 쓸 때와 같이 두 번째 라운드를 트리거합니다.)

으아아아 /blog/1/foo/?comments=15 这样的内容将加载 /blog/index.php?id=1&title=foo&comments=15쿼리 문자열 추가 플래그를 사용하면 원래 get 매개변수에 추가될 추가 변수를 지정된 URL에 전달할 수 있습니다. 이 예에서는

과 같은 의미입니다. 으아아아 R=301이 플래그는 위의 예에서 사용한 플래그는 아니지만 언급할 가치가 있다고 생각했습니다. 이를 통해 http 리디렉션을 지정하고 선택적으로 상태 코드(예:

)를 포함할 수 있습니다. 예를 들어 /myblog/에서 /blog/로 301 리디렉션을 수행하려면 다음과 같은 규칙을 작성하면 됩니다.

으아아아

다시 쓰기 조건

다시 쓰기 조건다시 쓰기를 더욱 강력하게 만들어 보다 구체적인 상황에 대한 다시 쓰기를 지정할 수 있습니다. 이에 대한 자세한 내용은 中阅读很多条件>문서

에서 읽을 수 있지만 몇 가지 일반적인 예를 살펴보고 설명하겠습니다.

으아아아 www. (如果尚不存在)并执行 301 重定向。例如,加载 http://example.com/blog/ 会将您重定向到 http://www.example.com/blog/이는 매우 일반적인 관행이며 도메인 이름 앞에

을 추가합니다. 으아아아

흔하지는 않지만 파일명이 서버에 존재하는 디렉터리나 파일인 경우 규칙이 실행되지 않는 이유를 보여주는 좋은 예입니다.
  • %{REQUEST_URI} .(jpg|jpeg|gif|png)$ [NC]
  • 파일 확장자가 jpg, jpeg, gif 또는 png인 파일만 다시 작성됩니다(대소문자 구분 안 함).
  • %{REQUEST_FILENAME} !-f
  • 현재 서버에 파일이 있는지 확인하고 파일이 없으면 다시 쓰기를 수행합니다
  • %{REQUEST_FILENAME} !-d
  • 현재 서버에 파일이 있는지 확인하고 파일이 없으면 다시 쓰기를 수행합니다
  • 다시 쓰기는 다른 도메인에 있는 동일한 파일을 로드하려고 시도합니다
🎜
2023-10-21 11:08:48

제출하다

0

mod_rewrite가 무엇인지 이해하려면 먼저 웹 서버가 작동하는 방식을 이해해야 합니다. 웹 서버는 HTTP 요청에 응답합니다. HTTP 요청의 가장 기본적인 수준은 다음과 같습니다.

으아악

이것은 URL /foo/bar.html에 대해 브라우저에서 웹 서버로 보내는 간단한 요청입니다. 파일을 요청하는 것이 아니라 단지 임의의 URL을 요청한다는 점을 강조하는 것이 중요합니다. 요청은 다음과 같을 수도 있습니다:

으아악

이는 URL 요청과 마찬가지로 작동하며 분명히 파일에 구애받지 않습니다.

웹 서버는 포트에서 수신 대기하고 해당 포트의 HTTP 요청을 수락하고 응답을 반환하는 애플리케이션입니다. 웹 서버는 적합하다고 판단되는 방식으로/귀하가 응답하도록 구성한 방식으로 응답하여 모든 요청에 ​​완전히 자유롭게 응답합니다. 이 응답은 파일이 아니라 HTTP 응답으로, 디스크에 있는 실제 파일과 관련이 있을 수도 있고 없을 수도 있습니다. 웹 서버는 Apache일 필요가 없으며 다른 웹 서버도 많이 있습니다. 이들은 단지 지속적으로 실행되고 HTTP 요청에 응답하는 포트에 연결된 프로그램일 뿐입니다. 직접 작성할 수 있습니다. 이 단락의 목적은 URL이 파일과 직접적으로 동일하다는 개념을 이해하는 데 매우 중요합니다. :)

대부분의 웹 서버의 기본 구성은 하드 드라이브에서 URL과 일치하는 파일을 찾는 것입니다. 서버의 문서 루트/var/www,它可能会查找文件/var/www/foo/bar. html로 설정되어 있는 경우 존재하면 이를 제공합니다. 파일이 ".php"로 끝나면 PHP 인터프리터를 호출하고 결과를 반환합니다. 이러한 모든 연결은 완전히 구성 가능합니다. 웹 서버가 PHP 인터프리터를 통해 파일을 실행하기 위해 파일이 ".php"로 끝날 필요는 없으며, 어떤 일이 발생하기 위해 URL이 디스크의 특정 파일과 일치할 필요도 없습니다.

mod_rewrite는 rewriting내부 요청 처리 방법입니다. 웹 서버가 URL/foo/bar에 대한 요청을 받으면 해당 URL을 다른 것으로 다시 작성할 수 있으며 웹 서버는 디스크에서 일치하는 파일을 찾습니다. 간단한 예:

으아악

이 규칙은 요청이 "/foo/bar"와 일치할 때마다 "/foo/baz"로 다시 작성한다는 의미입니다. 그러면 요청이 /foo/baz처럼 처리됩니다. 이는 다음과 같은 다양한 효과에 사용될 수 있습니다:

으아악

이 규칙은 모든 항목(.*) 并捕获它 ((..)),然后重写它以附加“.html” ”。换句话说,如果 /foo/bar 是请求的 URL,则将按照 /foo/bar.html.*)과 일치하고 이 항목((..))을

캡처한 다음 ".html"을 추가하도록 다시 작성합니다. 즉,

가 요청된 경우입니다. URL의 경우 정규식 일치, 캡처 및 교체에 대한 자세한 내용은

http://regular-expressions.info🎜를 참조하세요. 🎜자주 접하는 또 다른 규칙은 다음과 같습니다. 🎜으아악

이것은 다시 무엇이든 일치하고 index.php 파일과 url 查询参数中附加最初请求的 URL。即,对于传入的任何和所有请求,都会执行文件index.php,并且该文件将有权访问 $_GET['url']의 원래 요청에 다시 작성되므로 원하는 대로 무엇이든 할 수 있습니다.

먼저 이러한 재작성 규칙을 웹서버 구성 파일에 넣습니다. Apache에서는 문서 루트(예: .php 파일 옆)에 있는 .htaccess라는 파일에 해당 내용을 넣을 수도 있습니다.

* 기본 Apache 구성 파일에서 허용하는 경우 선택 사항이지만 일반적으로 활성화됩니다.

mod_rewrite는 아무것도 하지 않습니다

mod_rewrite는 마법처럼 모든 URL을 "예쁘게" 만들지는 않습니다. 이것은 일반적인 오해입니다. 웹사이트에 이 링크가 있는 경우:

으아악

mod_rewrite로는 예쁘게 만들 수 없습니다. 아름다운 링크를 만들려면 다음을 수행해야 합니다.

  1. 링크를 아름다운 링크로 변경하세요:

    GET /foo/bar.html HTTP/1.1
  2. 위 방법 중 하나를 사용하여 서버에서 mod_rewrite를 사용하여 URL

    에 대한 요청을 처리하세요. /my/pretty/link

(보내는 HTML 페이지와 여기에 포함된 링크를 변환하는 것과 함께 mod_substitute을 사용할 수 있습니다. 이는 일반적으로 HTML 리소스를 업데이트하는 것보다 더 힘들지만)

mod_rewrite는 많은 일을 할 수 있습니다. 여러 재작성 연결, 완전히 다른 서비스나 시스템에 대한 요청 프록시, 특정 HTTP 상태 코드를 응답으로 반환, 요청 리디렉션 등을 포함하여 매우 복잡한 일치 규칙을 만들 수 있습니다. 이는 매우 강력하며 기본적인 HTTP 요청 응답 메커니즘을 이해한다면 매우 유용할 수 있습니다.

자동으로 링크를 예쁘게 만들지는 않습니다.

가능한 모든 플래그와 옵션은

공식 문서를 참조하세요.

2023-10-21 00:43:03

제출하다

Hot Tools

vc9-vc14(32+64비트) 런타임 라이브러리 모음(아래 링크)

vc9-vc14(32+64비트) 런타임 라이브러리 모음(아래 링크)

phpStudy 설치에 필요한 런타임 라이브러리 모음을 다운로드하세요.

VC9 32비트

VC9 32비트

VC9 32비트 phpstudy 통합 설치 환경 런타임 라이브러리

PHP 프로그래머 도구 상자 정식 버전

PHP 프로그래머 도구 상자 정식 버전

Programmer Toolbox v1.0 PHP 통합 환경

VC11 32비트

VC11 32비트

VC11 32비트 phpstudy 통합 설치 환경 런타임 라이브러리

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.