我在使用.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]
答案 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]