.htaccess 修改重写规则,但保持所有其他规则不变

.htaccess modify rewrite rule, but keep all other rules intact

我的.htaccess是这样的:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /


RewriteRule page/sitemap /sitemap.php
RewriteRule music/(.*) /music.php?slug=
RewriteRule results/(.*) /results.php?q=
RewriteRule list/(.*)/(.*) /list.php?letter=&page=

按预期工作。

当我调用 <a href="/page/sitemap">Sitemap</a> 时它调用 sitemap.php 我有一个漂亮的 URL.

<a href="/music/pop">Pop</a> 相同,它调用 music.php?slug=pop 并且也是一个漂亮的 URL。

问题是关于music/(.*) /music.php?slug=规则的;我想删除 music 这样我就可以将 mysite.com/pop 作为最终的 URL 而不是 mysite.com/music/pop 但保持所有其他规则不变。

如果我尝试:

RewriteRule (.*) /music.php?slug=

这是行不通的,因为我正在影响所有调用,但不知道如何,或者是否有可能实现我想要的方式。

希望我能解释清楚我的问题,谢谢!

这应该适合你:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteRule ^page/sitemap$ /sitemap.php [END]
RewriteRule ^results/(.+)$ /results.php?q= [END]
RewriteRule ^list/(.+)/(.+)$ /list.php?letter=&page= [END]

RewriteRule ^(.*)$ /music.php?slug= [END]

在我这边使用 [L] 标志似乎会导致内部服务器错误 - 不确定为什么会这样。使用 END 标志修复它。

也已将 (.*) 更改为 (.+)(不包括音乐规则)以使其匹配 1 个或多个字符 - 如果您不想要这种行为,您可以将其改回以使其匹配0个或更多。

基本上,这里发生了什么:我们首先检查特定的重写。如果不匹配,则将所有内容发送到 music.php。您拥有的任何其他特定规则都应以相同的格式添加到音乐规则之上。

更新: 根据您的评论,以上内容与 index.php 重写和现有文件冲突。作为替代方案,您应该将 (.*) 传递给 index.php 并让该文件执行 music.php 的目的。不幸的是,您不能有两个具有相同重写模式的规则。见下文(包括允许 CSS/JS 文件等的更改):

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteRule ^page/sitemap$ /sitemap.php [END]
RewriteRule ^results/(.+)$ /results.php?q= [END]
RewriteRule ^list/(.+)/(.+)$ /list.php?letter=&page= [END]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?slug= [L]