我想将所有 .mp3 文件重写为 php 文件。我不想传递路径
所以 http://localhost/somepath/feb.mp3 http://localhost/feb.mp3
不应该有任何区别。
我想到了:
RewriteRule ^(.*)\.mp3$ /files/read/?file=$1.mp3 [QSA]
我遗漏了什么?也许是 (.*) 之前的一些正则表达式,但是为什么它不选择 mp3 模式并重定向到 /files/read/?file=feb.mp3 ?
这似乎甚至没有捕获 mp3 文件:
applying pattern '^(.*)\.mp3$' to uri 'feb.mp3'
它并不止于此,它经历了另一种情况,并且属于:
applying pattern '^.*$' to uri 'feb.mp3'
pass through /htdocs/project/project-web/feb.mp3
如果能解决这个问题的话非常感谢。
这是我的完整 .htaccess
SetEnv APPLICATION_ENV 开发
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*)\.mp3$ files/read/?file=$1.mp3 [QSA]
RewriteRule ^.*$ index.php [NC,L]
这似乎有效,但是它会重定向它。
RewriteRule ^(.+).mp3$ http://education.localhost/files/read/?file=$1.mp3 [NC,L]
这可能是因为当此重写规则确实适用时,情况就不会如此:
RewriteRule ^.*$ index.php [NC,L]
因此 files/read/?file=$1.mp3 依赖于 index.php 的角色,有什么办法可以让它工作吗?
答案1
当找到 MP3 时,让重写过程停止,而不是将请求发送到index.php
,而是使用[L]
标志。
为了使其不关心 MP3 文件名前面的目录路径,您需要排除最后一个斜杠字符之前的任何内容。
那么,尝试一下这个:
RewriteRule ([^/]*)\.mp3$ files/read/?file=$1.mp3 [QSA,L]
或者,您实际上是想重定向客户端,并仍然让它在后续请求中命中 index.php?我猜是这样,因为它是一个查询参数……试试这个:
RewriteRule ([^/]*)\.mp3$ files/read/?file=$1.mp3 [QSA,L,R=301]