설명: mod_rewrite 이해, URL 재작성 및 "예쁜 링크" 생성
P粉501007768
P粉501007768 2023-10-20 15:47:10
0
2
764

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

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

P粉501007768
P粉501007768

모든 응답(2)
P粉276064178

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
  • 현재 서버에 파일이 있는지 확인하고 파일이 없으면 다시 쓰기를 수행합니다
  • 다시 쓰기는 다른 도메인에 있는 동일한 파일을 로드하려고 시도합니다
🎜
P粉022140576

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 요청 응답 메커니즘을 이해한다면 매우 유용할 수 있습니다.

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

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

공식 문서를 참조하세요.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿