在rewriteCondition中,Apache ModRewrite从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文件也被脚本重写了。

尝试以下操作:

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

不确定你到底是什么,但是这将在内部重写一个formsdomain.com/app/css/build/app-23471942834.css/fs/current/public/css/build/app.css的URL。

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

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

更新#1:从评论…

我需要重写任何不是文件的东西

好的,这样做更有意义。 您可以用以下代替上面的RewriteCond指令:

 RewriteCond %{REQUEST_FILENAME} !-f 

如果请求的URL与文件系统上的文件匹配,那么只会处理下面的RewriteRulereplace。

更新#2:从更新的问题…

一个更通用的解决scheme,在现有的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存在一个文件,这将只重写请求文件系统。