"예쁜 링크"는 자주 요청되는 주제이지만 완전히 설명되는 경우는 거의 없습니다. mod_rewrite는 "예쁜 링크"를 만드는 한 가지 방법이지만 복잡하고 구문이 매우 간결하고 이해하기 어렵고 문서에서는 HTTP에 어느 정도 익숙하다고 가정합니다. "예쁜 링크"가 작동하는 방식과 mod_rewrite를 사용하여 링크를 만드는 방법을 간략하게 설명해 줄 수 있는 사람이 있습니까?
기타 일반 이름, 별칭, 일반 URL에 대한 용어: RESTful URL, 사용자 친화적인 URL, SEO 친화적인 URL, 슬러깅 및 MVC URL(잘못된 이름일 수 있음)
P粉2760641782023-10-21 11:08:48
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)的字符串。这可以通过规则右侧的
-
或 + code> (注意 +
用反斜杠转义,因为如果不转义它,这将作为 正则表达式重复字符)。这可以通过规则右侧的
$1
를 통해 참조할 수 있습니다?
表示前面的字符是可选的,因此在本例中 /blog/1/foo/
和 /blog/1/foo
+< / code>는 백슬래시로 이스케이프됩니다. 왜냐하면 이스케이프하지 않으면 정규식 반복 문자 $
및 /blog/1/foo code>는 동일한 위치에 다시 작성됩니다 < /a>
$는 이것이 일치시키려는 문자열의 끝이라는 의미입니다/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에 전달할 수 있습니다. 이 예에서는 < /p>
과 같은 의미입니다.
으아아아
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
P粉0221405762023-10-21 00:43:03
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<相反,已请求 /code>처럼 처리됩니다. 이는 다음과 같은 다양한 효과에 사용될 수 있습니다:
이 규칙은 모든 항목(.*
) 并捕获它 ((..)
),然后重写它以附加“.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로는 예쁘게 만들 수 없습니다. 아름다운 링크를 만들려면 다음을 수행해야 합니다.
GET /foo/bar.html HTTP/1.1
에 대한 요청을 처리하세요. /my/pretty/link
(보내는 HTML 페이지와 여기에 포함된 링크를 변환하는 것과 함께 mod_substitute
을 사용할 수 있습니다. 이는 일반적으로 HTML 리소스를 업데이트하는 것보다 더 힘들지만) < /a>
자동으로 링크를 예쁘게 만들지는 않습니다.
가능한 모든 플래그와 옵션은공식 문서를 참조하세요.