2011-07-08 84 views
0

我一直在努力解决这个问题,现在几个小时&如果有人不介意帮助我,它可能会为我节省一些时间。我的问题是关于Apache mod_rewrite;当然有吨的文件在那里,但没有具体到我的要求分别是:Apache Mod重写帮助

采取URL格式为:

language/pagename.php 

(语言要么是“英语”或“法国” ,我会为每一个单独编写一个规则[只需要一个例子],页面名称将是任何单词字符(w+)。所有的URL将有一个.php扩展名)。

然后重写它,因此URL不会在用户浏览器改变,但让PHP能以这种格式接收它:

language/page.php?slug=pagename 

例如所以$_GET['slug']将返回值pagename,然后所有请求都由page.php处理。

到目前为止,我最好的猜测是

RewriteEngine On 
RewriteBase/
RewriteRule ^english/(\w+).php$ english/page.php?slug=$1 

然而,这使PHP告诉我,slug=page这个URL,例如english/financial.php;而不是financial

试过很多其他的正则表达式公约太(.)代替w &等等..

回答

0

使用这些规则:在

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(english|french)/([^/\.]+)\.php$ /$1/page.php?slug=$2 [NC,QSA,L] 
  1. 这需要有地方的.htaccess文件在根文件夹中。如果您要将其配置文件(例如httpd-vhost.conf<VirtualHost>指令),则规则需要稍微改变。

  2. 此规则应适用于任何语言,只要你将其添加到规则(english|french部分)。

  3. 此规则有一个条件,如果此文件已存在,则不会重写。 这应该可以解决你的问题slug=page:在你的规则中,你很可能有一个重写循环(在重写发生之后它会进入下一次迭代 - 这就是mod_rewrite的工作原理,并且你需要有一些逻辑来打破这个循环)。您可以使用RewriteCond %{REQUEST_URI} !^/(english|french)/page\.php [NC]而不是RewriteCond %{REQUEST_FILENAME} !-f,但维护起来要困难得多(您需要在此处添加语言以及在重写规则本身中)。

  4. 如果您已经有其他一些重写规则,请注意将它们放在正确的位置(规则顺序)。

  5. 因为我不知道是肯定的名称(蛞蝓)会是什么页面,我用这个模式:[^/\.]+(任何字符除了/.)..但是你可以将其更改为\w+或任何你想会更好。

  6. 规则保留任何可选页面参数(查询字符串) - 可用于保护转诊/跟踪代码等

+0

你beuaty!在一个规则中涵盖两个语言文件夹的额外奖励点数。干杯。 – Reece