我想把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]
在这种情况下你一定要使用
[L]
标志我在第一条规则中摆脱了
RewriteCond
-模式足够简单,不需要单独的条件(这意味着必须完成2个匹配而不是我的实现中的1个)。在第二条规则中,使用
%{REQUEST_FILENAME}
检查请求的资源(原始的或已经重写的)是否在一个真实的文件/文件夹中,然后才重写。我也摆脱了
RewriteCond
这里的规则不是太复杂(它更难以阅读,特别是如果你的regex技能不是很好,但它是工作)。这也使我的回答有点不同于已经提供:)