我需要 mod_rewrite 来重新映射传入的 URL,以便它被捕获AliasMatch
。
RewriteCond %{REQUEST_URI} ^/app/(.*)$
RewriteRule ^/app/(.*) ^/dev-dave/app/$1
RewriteCond %{REQUEST_URI} ^/static/(.*)$
RewriteRule ^/static/(.*) ^/dev-dave/static/$1
AliasMatch ^/(.*)/static/(.*)$ /var/www/html/cosmos/$1/dist/static/$2
AliasMatch ^/(.*)/app/(.*)$ /var/www/html/cosmos/$1/dist/index.html
<Directory /var/www/html/cosmos>
AllowOverride None
Require all granted
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
</IfModule>
</Directory>
这可能吗?我无法让它工作。
答案1
总的来说服务器配置您应该在想要被 捕获的指令上使用PT
( passthrough
) 标志。(该标志隐含在RewriteRule
AliasMatch
PT
目录上下文,因此它不需要在文件后面、容器中出现的指令上执行<Directory>
。)
默认情况下,RewriteRule 中的目标(或替换字符串)被假定为文件路径。使用 [PT] 标志会导致它被视为 URI。也就是说,使用 [PT] 标志会导致 RewriteRule 的结果通过 URL 映射传回,这样基于位置的映射(例如 Alias、Redirect 或 ScriptAlias)就有机会生效。
例如,如果你有一个 /icons 的别名,并且有一个指向那里的 RewriteRule,那么你应该使用 [PT] 标志确保别名被评估。
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d
在旁边:你的前端控制器,稍后定义,缺少RewriteRule
指令?!所以这在当前状态下不会做任何事情。但是,它也容易出错……如果你稍后RewriteRule
在<Directory>
容器中添加了指令,那么前面的状况将会(意外地)被应用。