
다음과 같은 불행한 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
~ 안으로
답변2
.htaccess
하위 디렉터리에 있는 파일 에서 /library/photography/.htaccess
mod_rewrite를 사용하여 다음과 같은 작업을 수행하여 원하는 URL에 대한 요청을 내부적으로 다시 쓸 수 있습니다.
RewriteEngine On
RewriteCond %{QUERY_STRING} (^|&)cmd=image(&|$)
RewriteCond %{QUERY_STRING} (?:^|&)sfpg=([^&*]+)\*([^&]+)(&|$)
RewriteRule ^index\.php$ %1%2 [QSD,L]
첫번째상태( RewriteCond
지시문)은 단순히 cmd=image
URL 매개변수가 쿼리 문자열의 어느 위치에 있는지 확인합니다.
두번째상태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
하위 디렉토리 에 저장되고 sfpg
URL 매개변수는 해당 하위 디렉토리 내의 파일 경로를 나타냅니다( 는 제외 *
). (파일을 /library/Photography
포함하여 모두 하위 디렉터리에 있습니다 .htaccess
. 또는 적어도 .htaccess
여기서 작업 중인 파일입니다.)
이 경우에는RewriteRule
에는치환. synced/
예를 들어:
:
RewriteRule ^index\.php$ synced/%1%2 [QSD,L]
(내 대답의 맨 위에 있는 위의 규칙과 다른 모든 내용은 변경되지 않았습니다.)