
残念なことに、次のような 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
の中へ
答え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
ディレクティブの2番目の引数)は、相対的/library/photography/
ファイルパス (つまり、ファイルを含むサブディレクトリに対する相対パス.htaccess
)。
URL パラメータは任意の順序で出現できます。例:?sfpg=folder/*image.jpg&cmd=image
も正常に一致します。また、破棄される追加の URL パラメータが存在する場合もあります。
(クエリ文字列破棄)フラグQSD
は、書き換えられたリクエストから元のクエリ文字列を削除します (内部書き換えではそれほど重要ではありません)。
余談:
RewriteRule /index.php /
/index.php
と は両方とも同じリソースを返す必要があるため、これは内部書き換えとしては意味がありません/
。(重複コンテンツに関する SEO 問題を解決するために、通常は外部リダイレクトとして実装されます。)
アップデート:
しかし、一般的なアプローチに問題があると思います。実際のファイルは、リンクが示す場所に存在しません。更新された質問を参照してください。
更新内容を正しく理解していれば、提供したい「実際のファイル」はサブsynced
ディレクトリに保存され、sfpg
URL パラメータはそのサブディレクトリ内のファイル パス ( を除く) を参照することになりますか? (ファイルを含め、サブディレクトリ*
内のすべてのファイルです。少なくとも、ここで作業しているファイルはそうです。)/library/Photography
.htaccess
.htaccess
その場合、RewriteRule
ディレクティブにプレフィックスを付けて変更するだけで済むようです。代替文字列synced/
。例:
:
RewriteRule ^index\.php$ synced/%1%2 [QSD,L]
(その他すべては、私の回答の冒頭にある上記のルールから変更されていません。)