如何使用 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]

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/.htaccess您可以使用 mod_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 参数,这些参数将被丢弃。

(查询字符串丢弃)标志QSD从重写的请求中删除原始查询字符串(对于内部重写来说这并不重要)。


在旁边:

RewriteRule /index.php /

作为内部重写,这实际上没有任何意义,因为/index.php/应该返回相同的资源。(这通常会作为外部重定向来实现,以解决与重复内容有关的任何 SEO 问题。)


更新:

然而,我认为我发现了一般方法中的一个问题。实际文件并不位于链接所暗示的位置。请参阅我更新的问题。

如果我正确理解了您的更新,您希望提供的“真实文件”存储在子目录中synced,并且sfpgURL参数指的是该子目录中的文件路径(减去*)?(所有内容都在/library/Photography子目录中,包括.htaccess文件。或者至少是.htaccess我们在此处处理的文件。)

在这种情况下,你似乎只需要通过RewriteRule代换字符串用 表示synced/。例如:

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

(其他所有内容均与上面的规则保持不变,位于我的答案的顶部。)

相关内容