"예쁜 링크"는 자주 요청되는 주제이지만 완전히 설명되는 경우는 거의 없습니다. mod_rewrite는 "예쁜 링크"를 만드는 한 가지 방법이지만 복잡하고 구문이 매우 간결하고 이해하기 어렵고 문서에서는 HTTP에 어느 정도 익숙하다고 가정합니다. "예쁜 링크"가 작동하는 방식과 mod_rewrite를 사용하여 링크를 만드는 방법을 간략하게 설명해 줄 수 있는 사람이 있습니까?
기타 일반 이름, 별칭, 일반 URL에 대한 용어: RESTful URL, 사용자 친화적인 URL, SEO 친화적인 URL, 슬러깅 및 MVC URL(잘못된 이름일 수 있음)
deceze의 답변을 확장하기 위해 다른 mod_rewrite 기능에 대한 몇 가지 예와 설명을 제공하고 싶습니다. p>
아래의 모든 예는 귀하가 이미
.htaccess
文件中包含RewriteEngine On
에 있다고 가정합니다.예제 다시 작성
예를 들어보겠습니다:
으아아아이 규칙은 4가지 부분으로 나누어져 있습니다:
RewriteRule
- 규칙 재작성 시작^blog/([0-9]+)/([A-Za-z0-9-+]+)/?$
- 이것을 패턴이라고 부르지만 저는 그냥 규칙의 왼쪽이라고 부르겠습니다 - 재정의하고 싶은 것blog/index.php?id=&title=
- 대체라고 함, 또는 다시 쓰기 규칙의 오른쪽 - 다시 쓰고 싶은 것[NC,L,QSA]
쉼표로 구분된 규칙 재작성 플래그입니다. 나중에 자세히 설명하겠습니다위를 다시 작성하면
가 로드됩니다./blog/1/foo/
와 같은 콘텐츠에 대한 링크를 허용할 수 있으며 실제로/blog/index.php?id=1&title=foo代码>.
규칙의 왼쪽
^
表示页面名称的开头 - 因此它将重写example.com/blog/...
但不会重写example.com/foo/博客/...
^는 페이지 이름의 시작 부분을 나타냅니다. 따라서(…)
각- (…) 괄호 세트는 정규식을 나타내며, 규칙 오른쪽에 있는 변수로 캡처할 수 있습니다. 이 예에서는 다음과 같습니다.
첫 번째 대괄호 세트 - - ([0-9]+) - 길이가 1자 이상이고 숫자 값(예: 0-9)만 포함하는 문자열과 일치합니다. 이는 규칙 오른쪽의
두 번째 대괄호 세트는 영숫자(A-Z, a-z 또는 0-9),([0-9]+)
- 匹配长度至少为 1 个字符且仅包含数字值(即 0-9)的字符串。这可以通过规则右侧的-
或+ code> (注意
를 통해 참조할 수 있습니다+
用反斜杠转义,因为如果不转义它,这将作为 正则表达式重复字符)。这可以通过规则右侧的$1
?
表示前面的字符是可选的,因此在本例中/blog/1/foo/
和/blog/1/foo
+는 백슬래시로 이스케이프됩니다. 왜냐하면 이스케이프하지 않으면 정규식 반복 문자$
및 /blog/1/foo code>는 동일한 위치에 다시 작성됩니다
$는 이것이 일치시키려는 문자열의 끝이라는 의미입니다
🎜로고🎜 🎜이러한 옵션은 특정 조건을 지정하기 위해 다시 쓰기 규칙 끝에 대괄호 안에 추가됩니다. 다시 말하지만, 🎜 문서에서 다양한 플래그 🎜에 대해 읽을 수 있지만 더 일반적인 플래그 중 일부를 다루겠습니다. 🎜 으아아아 🎜caseless 플래그는 다시 쓰기 규칙이 대소문자를 구분하지 않음을 의미합니다. 따라서 위의 예시 규칙에서는 🎜 및 🎜/BLOG/1/foo/(또는 그 변형)가 일치함을 의미합니다. 🎜으아아아/blog/1/foo/
和/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에 전달할 수 있습니다. 이 예에서는과 같은 의미입니다. 으아아아
)를 포함할 수 있습니다. 예를 들어 /myblog/에서 /blog/로 301 리디렉션을 수행하려면 다음과 같은 규칙을 작성하면 됩니다.R=301
이 플래그는 위의 예에서 사용한 플래그는 아니지만 언급할 가치가 있다고 생각했습니다. 이를 통해 http 리디렉션을 지정하고 선택적으로 상태 코드(예:으아아아
다시 쓰기 조건다시 쓰기 조건다시 쓰기를 더욱 강력하게 만들어 보다 구체적인 상황에 대한 다시 쓰기를 지정할 수 있습니다. 이에 대한 자세한 내용은 中阅读很多条件>문서
에서 읽을 수 있지만 몇 가지 일반적인 예를 살펴보고 설명하겠습니다.으아아아
www.
(如果尚不存在)并执行 301 重定向。例如,加载http://example.com/blog/
会将您重定向到http://www.example.com/blog/
이는 매우 일반적인 관행이며 도메인 이름 앞에을 추가합니다. 으아아아
흔하지는 않지만 파일명이 서버에 존재하는 디렉터리나 파일인 경우 규칙이 실행되지 않는 이유를 보여주는 좋은 예입니다.%{REQUEST_URI} .(jpg|jpeg|gif|png)$ [NC]
%{REQUEST_FILENAME} !-f
%{REQUEST_FILENAME} !-d
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"을 추가하도록 다시 작성합니다. 즉,.*
) 并捕获它 ((..)
),然后重写它以附加“.html” ”。换句话说,如果/foo/bar
是请求的 URL,则将按照/foo/bar.html
.*)과 일치하고 이 항목((..))을가 요청된 경우입니다. URL의 경우 정규식 일치, 캡처 및 교체에 대한 자세한 내용은
http://regular-expressions.info🎜를 참조하세요. 🎜자주 접하는 또 다른 규칙은 다음과 같습니다. 🎜으아악이것은 다시 무엇이든 일치하고 index.php 파일과
url
查询参数中附加最初请求的 URL。即,对于传入的任何和所有请求,都会执行文件index.php,并且该文件将有权访问$_GET['url']
의 원래 요청에 다시 작성되므로 원하는 대로 무엇이든 할 수 있습니다.먼저 이러한 재작성 규칙을 웹서버 구성 파일에 넣습니다. Apache에서는 문서 루트(예: .php 파일 옆)에 있는
.htaccess
라는 파일에 해당 내용을 넣을 수도 있습니다.* 기본 Apache 구성 파일에서 허용하는 경우 선택 사항이지만 일반적으로 활성화됩니다.
mod_rewrite는 아무것도 하지 않습니다으아악
mod_rewrite로는 예쁘게 만들 수 없습니다. 아름다운 링크를 만들려면 다음을 수행해야 합니다.에 대한 요청을 처리하세요.
/my/pretty/link
(보내는 HTML 페이지와 여기에 포함된 링크를 변환하는 것과 함께
mod_rewrite는 많은 일을 할 수 있습니다. 여러 재작성 연결, 완전히 다른 서비스나 시스템에 대한 요청 프록시, 특정 HTTP 상태 코드를 응답으로 반환, 요청 리디렉션 등을 포함하여 매우 복잡한 일치 규칙을 만들 수 있습니다. 이는 매우 강력하며 기본적인 HTTP 요청 응답 메커니즘을 이해한다면 매우 유용할 수 있습니다.mod_substitute
을 사용할 수 있습니다. 이는 일반적으로 HTML 리소스를 업데이트하는 것보다 더 힘들지만)자동으로 링크를 예쁘게 만들지는 않습니다.
가능한 모든 플래그와 옵션은공식 문서를 참조하세요.