Mod rewrite Apache Mod重写帮助

Mod rewrite Apache Mod重写帮助,mod-rewrite,url-rewriting,Mod Rewrite,Url Rewriting,我已经研究了几个小时这个问题的解决方案&我想如果有人不介意帮我,这可能会节省我一些时间。我的问题是关于Apache mod_重写;当然,这里有大量的文档,但是没有任何特定于我的要求,这些要求是: 要获取此格式的URL,请执行以下操作: language/pagename.php language/page.php?slug=pagename (语言可以是“英语”或“法语”,我将为每种语言编写一个单独的规则。[不过只需要一个示例]。页面名称将是任何单词字符(w+)。所有URL都将具有.php扩

我已经研究了几个小时这个问题的解决方案&我想如果有人不介意帮我,这可能会节省我一些时间。我的问题是关于Apache mod_重写;当然,这里有大量的文档,但是没有任何特定于我的要求,这些要求是:

要获取此格式的URL,请执行以下操作:

language/pagename.php
language/page.php?slug=pagename
(语言可以是“英语”或“法语”,我将为每种语言编写一个单独的规则。[不过只需要一个示例]。页面名称将是任何单词字符
(w+)
。所有URL都将具有
.php
扩展名)

然后将其重写,以便URL不会在用户浏览器中更改,但php可以接收以下格式的URL:

language/pagename.php
language/page.php?slug=pagename
e、 g.因此,
$\u GET['slug']
将返回值
pagename
,然后所有请求都由page.php处理

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

RewriteEngine On
RewriteBase /
RewriteRule ^english/(\w+).php$ english/page.php?slug=$1
然而,这使得php告诉我这个URL的
slug=page
,例如
english/financial.php
;而不是
财务

我也尝试过一系列其他正则表达式约定,而不是
w
等等。

使用以下规则:

RewriteEngine On
RewriteBase /

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

  • 此规则适用于任何语言,只要您将其添加到规则中(
    english | french
    part)

  • 此规则具有一个条件,如果该文件已存在,则不会重写该条件。这应该可以解决你在
    slug=page
    中的问题:在你的规则中,你很可能有一个重写循环(重写发生后,它会进入下一个迭代——这就是mod_rewrite的工作方式,你需要有一些逻辑来打破这个循环)。而不是
    RewriteCond%{REQUEST\u FILENAME}-f
    您可以使用
    RewriteCond%{REQUEST\u URI}^/(英语|法语)/page\.php[NC]
    但维护起来有点困难(您需要在这里以及重写规则本身中添加语言)

  • 如果您已经有了一些其他重写规则,那么请注意将它们放在正确的位置(规则的顺序很重要)

  • 因为我不确定页面名称(slug)是什么,所以我使用了这种模式:
    [^/\.]+
    (除了
    /
    之外的任何字符)。。但您可以将其更改为
    \w+
    或任何您认为更好的选项

  • 规则保留任何可选页面参数(查询字符串)——用于保留引用/跟踪代码等


  • 你这个笨蛋!在一条规则中覆盖两个语言文件夹可获得额外加分。。干杯