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