0

我创建了一个在 IIS 服务器上运行良好的 php 框架,并且 RewriteRules 与 web.config 完美运行。

但是相同的规则不适用于具有 .htaccess 的 apache 服务器,我不明白为什么……它们是:

Options +FollowSymlinks

RewriteEngine On

RewriteRule picture/([a-zA-Z0-9]+)/([a-zA-Z\-0-9/]+).(jpg|png|gif)    app/Src/$1Bundle/public/img/$2.$3 [L]
RewriteRule picture/([a-zA-Z\-0-9/]+).(jpg|png|gif)    public/$1.$2 [L]
RewriteRule scripts/([a-zA-Z0-9]+)/(js|css|typo)/([a-zA-Z\-0-9=\./]+).(js|css) app/Src/$1Bundle/public/$2/$3.$4 [L]
RewriteRule scripts/(js|css|typo)/([a-zA-Z\-0-9=\./]+).(js|css) public/$1/$2.$3 [L]
RewriteRule scripts/(fonts)/([a-zA-Z\-0-9=\./]+).(eot|svg|ttf|woff)   public/$1/$2.$3 [L]
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

我已经尝试过这个解决方案(以及许多其他解决方案)(RewriteRule Last [L] flag not working?),但它没有奏效。

RewriteCond %{ENV:REDIRECT_STATUS} != 200

我的想法已经用完了...

4

1 回答 1

1
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

您的最后一条规则(重写所有内容)无条件运行,因此这将导致重写循环(500 错误响应)。

至少您需要防止请求index.php被进一步重写。例如:

RewriteRule ^index\.php$ - [L]
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

但是您大概还希望您的静态资源也可以直接访问吗?因此,排除映射到物理文件和目录的请求是一个常见的要求。例如:

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
RewriteRule picture/([a-zA-Z0-9]+)/([a-zA-Z\-0-9/]+).(jpg|png|gif)    app/Src/$1Bundle/public/img/$2.$3 [L]

您还从您的模式^中省略了任何字符串开头的锚点 ( ) 和结尾的锚点 ( ) 。这可能会导致匹配过多——甚至匹配重写的 URL——另一个循环。您需要更具体地进行模式匹配。$RewriteRule

于 2020-07-09T18:28:51.293 回答