301重定向到没有扩展名的网址

时间:2018-01-19 21:41:00

标签: php apache .htaccess redirect mod-rewrite

我正在尝试在网址中设置没有文件扩展名的网站。

我的所有页面都是php。

我的所有菜单链接都删除了扩展名,例如...

<a href="page1">page 1</a>
<a href="page2">page 2</a>
<a href="page3">page 3</a>

这些链接一切正常。

但我现在尝试设置.htaccess文件,以便从其他外部链接(例如Google)进行301重定向。

在我的htaccess文件中,我有......

Redirect 301 /page1.php https://www.mysite.co.uk/page1

但是这使得来自Google的链接找不到404页面 - 它不会转到它应该的页面。

我做错了什么,如何让这些301重定向正常工作?

修改

为了尝试调试这个,我改变了我的htaccess文件。我的完整htaccess代码现在就是这个......

DirectoryIndex index.php

CheckSpelling Off

FileETag none
ServerSignature Off

Options +FollowSymlinks

Redirect 301 https://www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1
Redirect 301 https://mysite.co.uk/page1.php https://www.mysite.co.uk/page1
Redirect 301 http://www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1
Redirect 301 http://mysite.co.uk/page1.php https://www.mysite.co.uk/page1
Redirect 301 www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1

现在,如果我按照菜单链接,我会...

https://www.mysite.co.uk/page1

如果我将https://www.mysite.co.uk/page1输入浏览器的地址栏,则会正确加载页面。

但是,如果我按照谷歌的链接,它最终会在......

http://www.mysite.co.uk/page1.php

这怎么可能?!

我已经覆盖了htaccess文件中的所有可能的网址,那么这个google链接如何转到最终带有.php的http://文件?

1 个答案:

答案 0 :(得分:2)

我假设您当前正在使用Apache的MultiViews(mod_negotiation的一部分)将没有文件扩展名的URL(例如/page1)映射到具有文件扩展名的相应URL(例如{{1} }) - 因为你的/page1.php文件中没有其他内容可以执行此操作。

MultiViews使用内部子请求映射文件扩展名,因此您需要使用mod_rewrite(.htaccess)而不是mod_alias(RewriteRule)才能重定向到无扩展名的URL,因为您只需要重定向直接请求,而不是子请求,并且无法区分Redirect

Redirect

您需要将上述Redirect 301 https://www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1 Redirect 301 https://mysite.co.uk/page1.php https://www.mysite.co.uk/page1 Redirect 301 http://www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1 Redirect 301 http://mysite.co.uk/page1.php https://www.mysite.co.uk/page1 Redirect 301 www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1 指令更改为以下内容。 (顺便说一下,上述指令实际上并没有做任何事情,因为所述的URL路径,例如。Redirect,永远不会匹配 - 这必须是一个根相对的URL路径。)

https://www.mysite.co.uk/page1.php

检查RewriteEngine On RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^(.*)\.php$ https://www.example.com/$1 [R=302,L] 环境变量的RewriteCond指令确保我们只重定向初始/直接请求。

请注意,这是一个临时(302)重定向。只有在确认完全正常后才能将其更改为REDIRECT_STATUS(永久)重定向。 (301s被浏览器严格缓存,因此可能会使测试出现问题。)

你也可以尝试使用以下单行代码(没有301指令):

RewriteCond

请注意添加RewriteRule ^(.*)\.php$ https://www.example.com/$1 [NS,R=302,L] NS)标志,以防止为内部子请求处理指令。

更新:尝试禁用nosubreq并使用mod_rewrite执行此操作(可能建议这样做)。例如:

MultiViews

附加文件扩展名的指令假定现有URL尚未包含点。即。仅当文件扩展名应用于URL时才会出现点。