mod_rewrite를 사용하여 URL의 두 부분을 어떻게 제거할 수 있나요?

mod_rewrite를 사용하여 URL의 두 부분을 어떻게 제거할 수 있나요?

다음과 같은 불행한 URL이 있습니다.

dom.tld/library/Photography/index.php?cmd=image&sfpg=2021/*IMG_3468.jpg
dom.tld/library/Photography/index.php?sfpg=2021/*

이것은 다음과 같아야합니다

dom.tld/library/Photography/2021/IMG_3468.jpg
dom.tld/library/Photography/2021/

본질적으로 파일 이름 앞의 index.php?cmd=image&sfpg=별표를 제거하고 싶습니다 .*

폴더 구조는 다음과 같습니다.

root /var/www/domain.tld/main/library/Photography -> tree -a
.
|-- .htaccess
|-- index.php
|-- _GalData
|   |-- info
|   |   |-- 2018
|   |   |   |-- April
|   |   |   |   |-- _sfpg_dir
|   |   |   |   `-- image.png
|   |   |   |-- _sfpg_dir
|   |   |   `-- image.png
|   |   |-- 2019
|   |   |   |-- _sfpg_dir
|   |   |   `-- image.png
|   |   `-- _sfpg_dir
|   `-- thumb
|       |-- 2018
|       |   |-- April
|       |   |   `-- image.jpg
|       |   `-- image.jpg
|       `-- 2019
|           `-- image.jpg
`-- synced
    |-- 2018
    |   |-- April
    |   |   `-- image.jpg
    |   `-- image.jpg
    `-- 2019
        `-- image.jpg

실제 이미지는 index.php에 저장 synced/되고 _GalData/생성됩니다. 주요 웹사이트는 다음 위치에 있습니다./var/www/domain.tld/main/index.html

답변1

이것이 최선의 방법이라고 100% 확신할 수는 없지만 다음과 같은 폴더 구조를 고려할 때

user@instance-apache:/var/www/html$ tree -a
.
├── .htaccess
├── index.html
└── library
    └── photography
        └── folder
            └── image.jpg

.htaccess 파일의 내용은 [업데이트됨]

RewriteEngine on
RewriteCond %{QUERY_STRING} .*\=(.*)\*(.*)
RewriteRule (.*/)index.php /$1%1%2 [QSD]

아파치가 만들어야 해

http://127.0.0.1/library/photography/index.php?cmd=image&sfpg=folder/*image.jpg

~ 안으로

http://127.0.0.1/library/photography/folder/image.jpg

답변2

.htaccess하위 디렉터리에 있는 파일 에서 /library/photography/.htaccessmod_rewrite를 사용하여 다음과 같은 작업을 수행하여 원하는 URL에 대한 요청을 내부적으로 다시 쓸 수 있습니다.

RewriteEngine On

RewriteCond %{QUERY_STRING} (^|&)cmd=image(&|$)
RewriteCond %{QUERY_STRING} (?:^|&)sfpg=([^&*]+)\*([^&]+)(&|$)
RewriteRule ^index\.php$ %1%2 [QSD,L]

첫번째상태( RewriteCond지시문)은 단순히 cmd=imageURL 매개변수가 쿼리 문자열의 어느 위치에 있는지 확인합니다.

두번째상태sfpg주변의 URL 매개변수 값 부분을 캡처합니다.* (사용 시 백슬래시로 이스케이프 처리해야 함).밖의특별한 의미를 무효화하기 위해 정규식 문자 클래스를 사용합니다). 그런 다음 이러한 항목은 %1%2 역참조에서 사용 가능하며 다음에서 사용됩니다.치환문자열(두 번째 인수RewriteRule )은 다음을 구성합니다.상대적인파일 경로(즉, 파일이 /library/photography/포함된 하위 디렉터리 에 상대적 .htaccess)

URL 매개변수는 어떤 순서로든 나타날 수 있습니다. 예. ?sfpg=folder/*image.jpg&cmd=image또한 성공적으로 일치합니다. 그리고 삭제되는 추가 URL 매개변수가 있을 수 있습니다.

(Query String Discard) 플래그 QSD는 다시 작성된 요청에서 원래 쿼리 문자열을 제거합니다(내부 재작성에는 실제로 중요하지 않음).


곁에:

RewriteRule /index.php /

이는 내부 재작성으로는 실제로 의미가 없습니다. 둘 다 동일한 리소스를 반환해야 하기 때문 /index.php입니다 /. (이는 일반적으로 중복 콘텐츠와 관련된 SEO 문제를 해결하기 위해 외부 리디렉션으로 구현됩니다.)


업데이트:

하지만 일반적인 접근 방식에서 문제를 발견했다고 생각합니다. 실제 파일은 링크가 암시하는 곳에 상주하지 않습니다. 내 업데이트된 질문을 참조하세요.

귀하의 업데이트를 올바르게 이해했다면 귀하가 제공하려는 "실제 파일"은 synced하위 디렉토리 에 저장되고 sfpgURL 매개변수는 해당 하위 디렉토리 내의 파일 경로를 나타냅니다( 는 제외 *). (파일을 /library/Photography포함하여 모두 하위 디렉터리에 있습니다 .htaccess. 또는 적어도 .htaccess여기서 작업 중인 파일입니다.)

이 경우에는RewriteRule 에는치환. synced/​예를 들어:

:
RewriteRule ^index\.php$ synced/%1%2 [QSD,L]

(내 대답의 맨 위에 있는 위의 규칙과 다른 모든 내용은 변경되지 않았습니다.)

관련 정보