繁体   English   中英

apache重定向到不同的目的地,具体取决于是否存在多个文件之一

[英]apache redirects with different destination depending on whether one of several files exists

我有一个静态网站(由Apache服务),可以在其中下载软件包。 这些软件包首先出现在站点的“开发”部分,然后在某些时候也可以在“发行”部分使用。 这些软件包可以存在于多个“存储库”之一中,但是可以保证每个软件包在所有存储库中都具有唯一的名称。 假设我的存储库名称是repos1,repos2和repos3。

所以目前我有这样的网址:

/packages/release/repos1/html/mypkg.html
/packages/devel/repos1/html/mypkg.html

我想设置重定向,以便用户可以转到:

/packages/mypkg/

...并且重写规则将尝试以下所有URL,并重定向到存在的第一个URL(如果没有,则重定向到404页)。 因此对于请求/packages/mypkg/

/packages/release/repos1/html/mypkg.html
/packages/release/repos2/html/mypkg.html
/packages/release/repos3/html/mypkg.html
/packages/devel/repos1/html/mypkg.html
/packages/devel/repos2/html/mypkg.html
/packages/devel/repos3/html/mypkg.html

我不清楚如何使用mod_rewrite做到这一点。 我知道有一个特殊的RewriteCond模式-f ,但是似乎在使用它之前,我必须先处理REQUEST_FILENAME ,这样我才能使用后向引用来解析包名称。

只是使事情变得更复杂,如果用户知道他们正在寻找发行版还是devel软件包,我想对此表示敬意,所以/packages/devel/mypkg/应该重定向到/packages/devel/X/html/mypkg.html X是Apache在其中找到文件的第一个存储库。 有任何想法吗?

使用mod_rewrite没有完美的方法。

无论如何,您可以将此代码放在/packages/.htaccess

Options -Indexes

RewriteEngine On
RewriteBase /packages/

################################################################################
# /packages/release/xxx or /packages/devel/xxx are internally rewritten to
# /packages/release/reposX/html/xxx.html or /packages/devel/reposX/html/xxx.html
# Note: (reposX) X is the first repos where xxx is found
################################################################################
RewriteCond %{DOCUMENT_ROOT}/packages/$1/repos1/html/$2\.html -f
RewriteRule ^(release|devel)/([^/]+)/$ $1/repos1/html/$2.html [L]

RewriteCond %{DOCUMENT_ROOT}/packages/$1/repos2/html/$2\.html -f
RewriteRule ^(release|devel)/([^/]+)/$ $1/repos2/html/$2.html [L]

RewriteCond %{DOCUMENT_ROOT}/packages/$1/repos3/html/$2\.html -f
RewriteRule ^(release|devel)/([^/]+)/$ $1/repos3/html/$2.html [L]

################################################################################
# /packages/xxx is internally rewritten to
# /packages/release/reposX/html/xxx.html or /packages/devel/reposX/html/xxx.html
# Note: all release repos are fetch first, then devel ones
#      (reposX) X is the first repos where xxx is found
################################################################################
RewriteCond %{DOCUMENT_ROOT}/packages/release/repos1/html/$1\.html -f
RewriteRule ^([^/]+)/$ release/repos1/html/$1.html [L]

RewriteCond %{DOCUMENT_ROOT}/packages/release/repos2/html/$1\.html -f
RewriteRule ^([^/]+)/$ release/repos2/html/$1.html [L]

RewriteCond %{DOCUMENT_ROOT}/packages/release/repos3/html/$1\.html -f
RewriteRule ^([^/]+)/$ release/repos3/html/$1.html [L]

RewriteCond %{DOCUMENT_ROOT}/packages/devel/repos1/html/$1\.html -f
RewriteRule ^([^/]+)/$ devel/repos1/html/$1.html [L]

RewriteCond %{DOCUMENT_ROOT}/packages/devel/repos2/html/$1\.html -f
RewriteRule ^([^/]+)/$ devel/repos2/html/$1.html [L]

RewriteCond %{DOCUMENT_ROOT}/packages/devel/repos3/html/$1\.html -f
RewriteRule ^([^/]+)/$ devel/repos3/html/$1.html [L]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM