使用.htaccess重写动态URL

时间:2010-12-09 00:49:28

标签: .htaccess url-rewriting

我在使用.htaccess重写动态网址时遇到了一些麻烦。重写应该相当简单,但我遗漏了一些东西,非常感谢一手。

网址方案:

http://www.example.com/index.php?p=/category/page-slug

应转换为:

http://www.example.com/category/page-slug

并且

http://www.example.com/index.php?p=/category/&f=feed/rss

应该成为:

http://www.example.com/category/feed/rss

我目前的重写规则是:

RewriteRule ^(.+)?$ index.php?p=$1 [NC,L]

但这不应该正常工作。有什么建议吗?

修改: 此规则现在部分工作,因为它加载页面,但没有像我的样式表和图像那样显示页面资产。我猜它是因为它们是相对的路径。有关解决方法的任何想法吗?

RewriteRule ^([a-zA-Z0-9-/+]+)$ http://example.com/index.php?p=/$1 [L]

2 个答案:

答案 0 :(得分:1)

您的页面资源未加载,因为它们的URL也正在被重写。

例如,使用像

这样的规则
RewriteRule ^(.*)$ index.php?p=$1 [NC,L]

的请求
http://www.example.com/images/logo.gif

将被重写为

http://www.example.com/index.php?p=/images/logo.gif

避免这种情况的常见方法是阻止对真实文件的请求与规则匹配。这通常是通过将这两个RewriteCond语句置于您的规则之上来完成的:

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

!-f表示不是文件,!-d表示不是目录。

然后,您需要一个不同的规则来匹配网址中的f=。来自lolraccoon的答案有一个很好的建议,但我认为他的方法与你想要的方式相反。

您的规则如何知道何时需要f=参数?如果它基于网址中存在单词feed,那么您可以尝试这样的内容(但也使用!-f!-d条件):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*/)(feed.*)$ index.php?p=/$1&f=$2

答案 1 :(得分:0)

尝试以下方法:

RewriteRule ^index.php?p=(.*)&f=(.*)$ /$1$2 [NC,L]
RewriteRule ^index.php?p=(.*)$ /$1 [NC,L]