.htaccess重定向/重写规则

时间:2015-01-15 18:54:38

标签: apache .htaccess mod-rewrite redirect

在网站上,我有一个.htaccess文件设置,用于重写网址的规则。我的所有内容页面都是动态生成的,因此只有一个文件content.php,它基本上根据查询参数生成页面。然后,根据主导航确定站点的链接结构。

所以在content.php上,它通过查看URL从数据库中提取页面。在幕后,URL基本上如下所示:

www.website.com/content.php?page=my-page

然而,使用重写,网址实际显示并显示如下:

www.website.com/my-page /

除了我遇到的一个问题外,这很有效。你可以在/ my-page /之前添加你想要的任何目录,并且/ my-page /的内容仍会显示。例如:

www.website.com/test1/test2/test3/my-page /

显示的内容与:

相同

www.website.com/my-page /

如果我想使用的实际链接是:www.website.com/section/my-page/ 如何将/ my-page /中ENDS的任何请求重定向到www.website.come / section / my-page /

我尝试过使用以下内容,但最终会以无限循环结束

RewriteRule (.*)/my-page/?$ http://www.website.com/section/my-page/ [L,R=301]

3 个答案:

答案 0 :(得分:1)

替换此规则:

RewriteRule (.*)/my-page/?$ http://www.website.com/section/my-page/ [L,R=301]

按此规则:

RewriteRule ^(?!my-page/my-second-page)(?:.+?/)?(my-second-page)/?$ /my-page/$1/ [L,NC,R=302]

RewriteRule ^.+?/(my-page)/?$ /$1/ [L,NC,R=302]

还要在新的浏览器中对此进行测试,以避免旧的301缓存。

答案 1 :(得分:0)

您的重写(.*)说明/您/喜欢/之前/我的网页将匹配,并且您在其末尾还有301永久重定向R=301,这是不需要的。

在.htaccess中,您可以在没有尾部斜杠的情况下进行重写:

RewriteEngine On
    RewriteRule ^/section/([^/\.]+)$ /content.php?page=section&id=$1
    RewriteRule ^/([^/\.]+)$ /content.php?page=$1 [L]

然后在content.php中:

$page = (!isset($_GET['page'])) ? 'indexPage' : $_GET['page'];

switch($page){

    case 'my-page':

 // process request for /my-page

    break;

    case 'my-other-page':

 // process request for /my-other-page

    break;

    case 'section':
    $section_id = (!isset($_GET['id'])) ? 'NONE' : $_GET['id'];

 // process /section/$section_id - i.e $section_id = my-section-1

    break;

    case 'indexPage':

 // process request for index page, i.e /

    break;

    default:

 // This should stop /the/anything/matching/my-page issue
    header("HTTP/1.0 404 Not Found");
}

在上面的php中,如果$page为空或未设置,则indexPage设置为$page - 并且如果$page已设置但是与$section_id中的任何内容不匹配切换/案例部分它返回404标题。

NONE的处理方式相同,但如果未设置或为空则设置为$page;与$section_id变量一样,如果{{1}}已发送但与任何内容不匹配,您也可以发送404标头。

答案 2 :(得分:0)

我遇到了这个问题,与小时的正则表达式混乱无济于事,遵循这些答案。结果很简单。

关闭MutliViews

简而言之,在您的服务器配置中,寻找类似的东西......

Options -Indexes +FollowSymLinks +MultiViews

...并将其更改为此...

Options -Indexes +FollowSymLinks -MultiViews

当然,根据您的文件,该行可能看起来非常不同。关键是,将-放在MultiViews前面。

  

注意:如果您在该行上看不到任何符号,请删除   而是MultiViews。 Apache2是使用符号的全有或全无。

如果您不能(或者不想)更改服务器配置,请将此行添加到.htaccess ...

Options -MultiViews

为我修好了!