我正在尝试在网址中设置没有文件扩展名的网站。
我的所有页面都是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://文件?
答案 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时才会出现点。