将请求文件名(%{REQUEST_FILENAME})更改为.htaccess中的新路径

时间:2015-06-12 03:34:58

标签: regex apache .htaccess mod-rewrite

我正在尝试使用与RewriteRule相同的 .htaccess 中的Alias /var/www/html/core/ Alias /var/www/html/core/latest/

我在 / var / www / html / core 中创建了 .htaccess

RewriteEngine On

#Check if file exist in original path (/var/www/html/core):
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

#try new path (/var/www/html/core/latest):
RewriteRule ^(.*)$ latest/$1 [NC,L]

这是有效的。但如果 / var / www / html / core / latest 中存在文件,则表示内部服务器错误而不是正常的404错误。所以我必须在最后RewriteCond *** -f之前使用一些RewriteRule,以确保文件存在于新路径中。

问题是我无法将%{REQUEST_FILENAME}更改为latest/%{REQUEST_FILENAME}。例如:

必须在 core / latest / img / loading.gif 中检查 core / img / loading.gif ,而不是 latest / core / img / loading.gif

是否有可能以某种方式解析.htaccess中的%{REQUEST_FILENAME}

1 个答案:

答案 0 :(得分:3)

您可以像这样调整规则:

RewriteEngine On
RewriteBase /core/

#Check if file exist in original path (/var/www/html/core):
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

#try new path (/var/www/html/core/latest):
RewriteCond %{DOCUMENT_ROOT}/core/latest/$1 -f
RewriteRule ^((?!latest/).*)$ latest/$1 [L,NC]

RewriteCond %{DOCUMENT_ROOT}/core/latest/$1 -f确保/core/latest/文件夹中存在该文件。