.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]
我的.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]