.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
帮我修好了!
在网站上,我有一个 .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
帮我修好了!