Apache ModRewrite 在 rewriteCondition 中从 request_uri 中删除部分

Apache ModRewrite 在 rewriteCondition 中从 request_uri 中删除部分

所以基本上我的 html 中有一个链接,domain.com/app/css/build/app-23471942834.css但在服务器上文件实际上位于 中/fs/current/public/css/build/app-23471942834.css。有没有办法检查文件是否存在于 中RewriteCondition?问题是我基本上需要/css/build/app-23471942834.css检查的部分,而不需要/app。有没有办法在条件中删除它?

所以我需要:

  • domain.com/app/login改写为/fs/current/public/login
  • domain.com/app/build/css/app-123523.css改写为/fs/current/public/build/css/app-123523.css
  • domain.com/app/build/js/app-123523.js改写为/fs/current/public/build/js/build/app-123523.css

我正在使用 Laravel,因此我的目录中默认public有另一个:.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

抱歉,但我真的很不擅长 htaccess 文件。谢谢你的帮助。

我目前得到的:

RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1 -f
RewriteRule ^app/(.*)$ /fs/current/public/$1 [L]

RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteRule ^app/(.*)$ /fs/current/public/index.php?/$1 [L]

解决方案:

我这样解决了我的问题:

RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteCond %{REQUEST_URI} \.(css|jpg|gif|png|js|svg)
RewriteRule ^app/(.+)$ /fs/current/public/$1 [L]

所以所有的重写仅适用于 css/jpg/gif/png/js/svg 我认为我之前遇到的问题是 index.php 文件也被脚本重写了。

答案1

请尝试以下操作:

RewriteEngine On
RewriteRule ^/?app/(css/build/app)-\d+(\.css)$ /fs/current/public/$1$2 [L]

不确定您到底想要什么,但这会在内部将表单的 URL 重写domain.com/app/css/build/app-23471942834.css/fs/current/public/css/build/app.css

如果需要在重写之前检查目标文件是否存在,那么您可以添加状况之前RewriteRule(虽然我不确定你为什么需要这样做,因为无论如何你都会得到 404)。例如:

RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1$2 -f

更新#1:来自评论...

我需要重写任何非文件的内容

啊,好吧,这更有意义了。你可以RewriteCond用下面的命令替换上面的指令:

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule当请求的 URL 确实不是匹配文件系统上的文件。

更新#2:来自更新的问题...

更通用的解决方案是,在现有RewriteEngine指令之后,在 .htaccess 中尝试以下内容:

RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1 -f
RewriteRule ^app/(.+)$ /fs/current/public/$1 [L]

仅当文件系统中存在<document-root>/fs/current/public/css/build/app-23471942834.css或形式的文件时,这才会重写请求。<document-root>/fs/current/public/login

相关内容