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

时间:2015-06-12 00:17:36

标签: php .htaccess rewrite

我的.htaccess是这样的:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /


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

按预期工作。

当我致电<a href="/page/sitemap">Sitemap</a>时,它会调用sitemap.php并且我有一个漂亮的网址。

<a href="/music/pop">Pop</a>调用music.php?slug=pop的方式相同,也是一个漂亮的网址。

问题在于music/(.*) /music.php?slug=$1规则;我想删除音乐,以便我可以将 mysite.com/pop 作为最终网址,而不是 mysite.com/music/pop 但是保持所有其他规则。

如果我尝试:

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

这不起作用,因为我正在影响所有的电话,但不知道如何,或者是否有可能按照我想要的方式。

希望我能很好地解释我的问题,谢谢!

1 个答案:

答案 0 :(得分:1)

这应该适合你:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

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

RewriteRule ^(.*)$ /music.php?slug=$1 [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=$1 [END]
RewriteRule ^list/(.+)/(.+)$ /list.php?letter=$1&page=$2 [END]

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