我正在开发一个php应用程序,我对Apache和Mod Rewrite有一点问题。谁知道这里有什么问题?:
RewriteEngine on
RewriteBase /mysite/
RewriteRule ^css\/css\.css css/css.php [L]
RewriteRule ^js\/js\.js js/js.php [L]
RewriteRule !^img\/.* index.php
当我把http://localhost/css/css.css放到index.php时,也许我错过了什么...... 为什么当url与第一个规则apache匹配时,不会停止重写过程?
'last | L'(最后一条规则)
在这里停止重写过程 不再应用任何重写规则。 这对应于Perl last 命令或来自的命令 C语言。使用此标志可以防止 当前重写的URL 按照以下规则进一步改写。 例如,用它来重写 根路径URL('/')到真实的, 例如,'/ e / www /'。
我从3个小时开始重写论坛和文档,我仍然遇到同样的问题。
提前致谢。
答案 0 :(得分:5)
Centauro12,问题是,[L]标志实际上通过以下规则停止传播,但是(如果你在.htaccess文件中)URL映射开始再一次。这意味着,所有您的规则将再次处理。有关详细信息,请参阅Apache Rewrite Guide。
因此,您需要明确禁用重写的PHP脚本的重写:
RewriteRule ^css/css.php - [L]
RewriteRule ^js/js.php - [L]
或更紧凑(虽然可能不是你想要的):
# don't rewrite anything that really exists
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [L]
答案 1 :(得分:1)
试
RewriteRule ^/css/css\.css css/css.php [L]
RewriteRule ^/js/js\.js js/js.php [L]
RewriteRule ! /^img/.* index.php
即。如果您^
- 将pattern锚定到字符串的开头,请使用/
启动它。模式与URL-paths匹配,以/
开头。
编辑
上面的仅对服务器配置,虚拟主机和目录context有效。如果上下文是.htaccess,则在匹配规则之前剥离包含第一个斜杠的每个目录前缀(并在之后添加),因此这里不需要^/
。
答案 2 :(得分:1)
我找到了解决方案:
RewriteEngine on
RewriteBase /mysite/
RewriteRule ^css\/css\.css css/css.php [L]
RewriteRule ^css\/(.*)$ css/$1 [L]
RewriteRule ^js\/js\.js js/js.php [L]
RewriteRule ^js\/(.*)$ js/$1 [L]
RewriteRule ^img/(.*)$ img/$1 [L]
RewriteRule ^(.*)$ index.php?rewrite=$1
它工作正常,但我不知道为什么这是必要的
RewriteRule ^css\/(.*)$ css/$1 [L]
和
RewriteRule ^js\/(.*)$ js/$1 [L]
我希望它能解决任何问题。
谢谢! :)
答案 3 :(得分:0)
在使用“^ css ...”启动表达式之前,您可能必须将重写基数设置为“/”
RewriteBase /