htaccess干净的网址

时间:2011-07-20 14:03:28

标签: php .htaccess mod-rewrite

我想将我的网址更改为:

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)结果:

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

我也使用htaccess测试仪(http://htaccess.madewithlove.be/),一切都还可以! :(

3 个答案:

答案 0 :(得分:1)

两个规则都已通过,因此已应用。第一个将/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]

答案 1 :(得分:1)

您正在捕获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]

答案 2 :(得分:0)

这个对我来说很好用:

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次)。 / p>

  3. 在第二个规则中,使用%{REQUEST_FILENAME}检查所请求的资源(原始的或已经重写的)是否在真实的文件/文件夹中,然后才重写。这样可以防止你面临双重重写。

  4. 我在这里也摆脱了RewriteCond,因为规则并不太复杂(它更难以阅读,特别是如果你的正则表达式技能不是很好,但它有效)。这也使我的回答与已经提供的有点不同:)