htaccess clean url


htaccess clean url

我想把url改成:

www.xxxx.com/en/ -> index.php?lang=en
www.xxxx.com/news -> index.php?mod=news

我使用这段代码,但它不起作用:

RewriteCond %{REQUEST_URI} ^/(pe|en|fr|sp|ar)/$ 
RewriteRule ^([^/]*)/$ index.php?lang=$1
RewriteCond %{REQUEST_URI} !^/(pe|en|fr|sp|ar)$ 
RewriteRule ^([^/]*)$ index.php?mod=$1 

var_dump($_GET) result:

array(2) { ["mod"]=> string(9) "index.php" ["PHPSESSID"]=> string(32) "e7a5fc683653b7eea47a52dfc64cd687" }

我也使用htaccesstester (http://htaccess.madewithlove.be/),一切都很好!(

两个规则都通过,因此被应用。第一个将/en/重写为/index.php?lang=en。然后第二个规则通过,并重写为/index.php?mod=index.php

使用[L]选项在给定规则通过后停止处理:

RewriteCond %{REQUEST_URI} ^/(pe|en|fr|sp|ar)/$ 
RewriteRule ^([^/]*)/$ index.php?lang=$1 [L]
RewriteCond %{REQUEST_URI} !^/(pe|en|fr|sp|ar)$ 
RewriteRule ^([^/]*)$ index.php?mod=$1 [L]

您正在捕获index.php。忽略现有的文件和目录,并停止使用[L]

处理规则
RewriteCond %{REQUEST_URI} ^/(pe|en|fr|sp|ar)/$ 
RewriteRule ^([^/]*)/$ index.php?lang=$1 [L]
# Don't rewrite index.php or other existing file/dir
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI} !^/(pe|en|fr|sp|ar)$ 
RewriteRule ^([^/]*)$ index.php?mod=$1 [L]

这个对我来说很好:

RewriteRule ^(pe|en|fr|sp|ar)/$ index.php?lang=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?!(?:pe|en|fr|sp|ar)/)([^/]*)$ index.php?mod=$1 [L]
  1. 在这种情况下你一定要使用[L]标志

  2. 我在第一条规则中摆脱了RewriteCond -模式足够简单,不需要单独的条件(这意味着必须完成2个匹配而不是我的实现中的1个)。

  3. 在第二条规则中,使用%{REQUEST_FILENAME}检查请求的资源(原始的或已经重写的)是否在一个真实的文件/文件夹中,然后才重写。

  4. 我也摆脱了RewriteCond这里的规则不是太复杂(它更难以阅读,特别是如果你的regex技能不是很好,但它是工作)。这也使我的回答有点不同于已经提供:)