我有一个旧项目的问题,该项目具有以下 mod_rewrite 条件/规则:
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
但.phtml文件在浏览器中呈现为纯文本。
问题是我在公共目录中有一些符合第一个重写条件的 .phtml 文件‘-s’(是常规文件,有大小),因此它们不会被发送到 index.php。事实上,.phtml 文件显示为纯文本!我需要将这些文件保存在那里,所以我无法设置deny from all
该目录,因为它还包含一些图像和内容。
我尝试过这个:
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
RewriteRule \.phtml$ index.php [NC,L]
但它不起作用,因为它已经满足第一个重写条件,所以应用了第一条规则(不执行任何操作)。
我怎样才能解决这个问题?
答案1
我认为规则和 .htaccess 不是这里的条件。您应该配置 apache tu 使用 php 的 phtml 文件:
AddType application/x-httpd-php .php .phtml .html
然后规则
RewriteRule \.phtml$ index.php [NC,L]
可以省略并且它应该可以工作,因为文件存在并且有大小,所以 apache 应该像任何其他 PHP 文件一样处理它。
编辑: 如果您根本不想提供 .phtml 文件,您可以像这样使用重写:
RewriteCond %{REQUEST_FILENAME} \.phtml$
RewriteRule ^.*$ index.php [NC,L]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
答案2
您说:“但是它不起作用,因为它已经满足第一个重写条件,所以应用了第一条规则(不执行任何操作)。”
这是非常正确的,因为规则中的 L 标志告诉 apache,如果应用了它,则不应应用其他规则。
它通常用于重定向等,但在您的情况下不需要此标志。
尝试以下配置:
RewriteCond %{REQUEST_FILENAME} !-s [AND]
RewriteCond %{REQUEST_FILENAME} !-l [AND]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php [NC,L]