mod_rewrite を使用して URL の 2 つの別々の部分を削除するにはどうすればよいですか?

mod_rewrite を使用して URL の 2 つの別々の部分を削除するにはどうすればよいですか?

残念なことに、次のような 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]

Apacheは

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 パラメータがクエリ文字列内のどこかに存在することを確認するだけです。

二番目状態sfpgURLパラメータ値の文字を囲む部分をキャプチャします*(使用する場合はバックスラッシュでエスケープする必要があります)。正規表現の文字クラスを特殊意味を否定するために使用することもできます。これらはそれぞれ%1および%2後方参照で使用可能になり、代替文字列(RewriteRuleディレクティブの2番目の引数)は、相対的/library/photography/ファイルパス (つまり、ファイルを含むサブディレクトリに対する相対パス.htaccess)。

URL パラメータは任意の順序で出現できます。例:?sfpg=folder/*image.jpg&cmd=imageも正常に一致します。また、破棄される追加の URL パラメータが存在する場合もあります。

(クエリ文字列破棄)フラグQSDは、書き換えられたリクエストから元のクエリ文字列を削除します (内部書き換えではそれほど重要ではありません)。


余談:

RewriteRule /index.php /

/index.phpと は両方とも同じリソースを返す必要があるため、これは内部書き換えとしては意味がありません/。(重複コンテンツに関する SEO 問題を解決するために、通常は外部リダイレクトとして実装されます。)


アップデート:

しかし、一般的なアプローチに問題があると思います。実際のファイルは、リンクが示す場所に存在しません。更新された質問を参照してください。

更新内容を正しく理解していれば、提供したい「実際のファイル」はサブsyncedディレクトリに保存され、sfpgURL パラメータはそのサブディレクトリ内のファイル パス ( を除く) を参照することになりますか? (ファイルを含め、サブディレクトリ*内のすべてのファイルです。少なくとも、ここで作業しているファイルはそうです。)/library/Photography.htaccess.htaccess

その場合、RewriteRuleディレクティブにプレフィックスを付けて変更するだけで済むようです。代替文字列synced/。例:

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

(その他すべては、私の回答の冒頭にある上記のルールから変更されていません。)

関連情報