mod_rewrite - 组合规则的麻烦

时间:2011-07-13 16:42:41

标签: mod-rewrite

我有以下规则可以使用:

  • 仅对存在的文件执行操作
  • 在其uri
  • 中排除包含图片| 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美元正在用斜线喂食。我认为[^/]会删除它,但显​​然不会。

有人可以解释我在哪里错了吗?

1 个答案:

答案 0 :(得分:1)

使用此规则 - 它会将/sitemap/重写为/index.php?page=sitemap

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ /index.php?page=$1 [QSA,L]
  1. 将.htaccess放入网站根文件夹。如果放在别处,需要稍微调整一下。

  2. 网址将保持不变。现有的查询字符串将被保留。

  3. 必须存在尾部斜杠/(即/sitemap不会触发此规则。)

  4. 只有在没有这样的文件夹或文件时才会重写(例如,如果您的网站根文件夹中有一个名为sitemap的文件夹,则不会进行重写。)

  5. 它仅适用于1个文件夹的深层网址(例如/sitemap//help//user-account/等。它不适用于路径中的2个或更多文件夹(例如/account/history/)。


  6. RE:此行: RewriteCond %{REQUEST_URI} !/(images|js|css)$

    你说你想要“在他们的uri中排除任何包含图片| js | css的文件”。不幸的是,上述模式的工作方式不同 - 它与/something/css匹配,但与/css/something/something/file.css不匹配。

    如果您想在斜线后直接匹配图片| js | css ANYWHERE,请删除$