.htaccess Redirect/Rewrite 规则

.htaccess Redirect/Rewrite rules

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

在 content.php 上,它通过查看 URL 从数据库中拉取页面。在幕后,URL 基本上是这样的:

www.website.com/content.php?page=我的页面

但是使用重写,url 实际上显示和显示如下:

www.website.com/my-page/

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

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

显示与以下内容相同的内容:

www.website.com/my-page/

如果我实际要使用的link是:www.website.com/section/my-page/ 我怎样才能将 /my-page/ 中结束的任何请求重定向到 www.website.come/section/my-page/

我试过使用以下方法,但最终陷入死循环

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

你的重写 (.*) 是说 anything/you/like/before/my-page 会匹配,你还有一个 301 永久重定向 R=301 在它的末尾,这是不需要的。

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

RewriteEngine On
    RewriteRule ^/section/([^/\.]+)$ /content.php?page=section&id=
    RewriteRule ^/([^/\.]+)$ /content.php?page= [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 为空或未设置,则 $page 设置为 indexPage - 如果 $page 已设置但未设置'匹配 switch/case 部分中的任何内容它 returns a 404 header.

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

替换此规则:

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

根据这个规则:

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

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

同时在新浏览器中进行测试以避免旧的 301 缓存。

我遇到了这个问题,在 小时 中使用正则表达式搞砸了 无济于事,遵循这些答案。原来很简单。

关闭 MutliViews

简而言之,在您的服务器配置中,寻找类似这样的内容...

Options -Indexes +FollowSymLinks +MultiViews

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

Options -Indexes +FollowSymLinks -MultiViews

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

NOTE: If you don't see any symbols on that line, just remove MultiViews instead. Apache2 is all-or-nothing about use of symbols.

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

Options -MultiViews

帮我修好了!