我有以下规则可以使用:
- 仅对存在的文件执行操作
- 排除任何在uri中包含images|js|css的文件
- 向请求uri添加尾部斜杠
重写规则:
RewriteEngine on
DirectorySlash Off
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/(images|js|css)$
RewriteRule ^(.*[^/.])$ /$1/ [R=301,L]
我现在需要正确地重定向我的主页uri,如下所示:
http://www.example.com/sitemap/
->http://www.example.com/index.php?page=sitemap
我尝试了以下方法:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/.])$ index.php?page=$1 [R=301,L,NC]
但我发现一个页面没有找到,大概是因为1美元被喂了一个带有斜杠的东西。我以为[^/]
会删除它,但显然没有。
有人能解释一下我在哪里出错了吗?
使用此规则--它将把/sitemap/
重写为/index.php?page=sitemap
:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ /index.php?page=$1 [QSA,L]
将其放入.htaccess的网站根文件夹中。如果放在其他地方,需要稍微调整一下。
URL将保持不变。将保留现有的查询字符串。
尾部斜线
/
必须存在(即/sitemap
不会触发此规则(。只有当没有这样的文件夹或文件时,它才会重写(即,如果您的网站根文件夹中有一个名为
sitemap
的文件夹,则不会发生重写(。它只适用于1文件夹深度URL(例如
/sitemap/
、/help/
、/user-account/
等(。它不适用于路径中的2个或多个文件夹(例如/account/history/
(。
RE:此行:RewriteCond %{REQUEST_URI} !/(images|js|css)$
。
您说您希望"排除在其uri中包含images|js|css的任何文件">。不幸的是,上面的模式工作方式不同——它将匹配/something/css
,但不匹配/css/something
或/something/file.css
。
如果您想在URL中的斜杠后面直接匹配images|js|css ANYWHERE,请删除$
。