URL 重写 - 不带文件扩展名的重定向
Posted
技术标签:
【中文标题】URL 重写 - 不带文件扩展名的重定向【英文标题】:URL Rewriting - Redirect With No File Extension 【发布时间】:2010-10-15 10:39:10 【问题描述】:我目前在 .htaccess 文件中使用以下规则:
RewriteEngine on
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME\.php -f
RewriteRule ^(.*)$ $1.php
这可以很好地确保/myfile.php
与myfile
一样有效(URL 中没有扩展名)。它还可以毫无问题地处理查询字符串,因此myfile?var=foo
也可以工作。
问题是这些在 Google Analytics 中注册为两个单独的文件。因此,虽然myfile.php
可能是我网站上第三受欢迎的页面,有 X 次访问,myfile
可能是我网站上第五受欢迎的页面,有 Y 次访问。
如何进行硬重定向,而不是“接受任何一种”类型的规则?
【问题讨论】:
【参考方案1】:试试这个规则来重定向.php
文件的请求:
RewriteCond %THE_REQUEST ^GET\ /(([^/?]*/)*[^/?]+)\.php
RewriteRule ^.+\.php$ /%1 [L,R=301]
【讨论】:
我在第一行和第二行之间添加了这个。它似乎没有任何效果。 所以如果你请求“/foo/bar.php”,你不会被重定向到“/foo/bar”? 不,它仍在加载 /foo/bar.php 我还必须移动右括号,因为在某些文件夹中使用它会剪切一个目录。【参考方案2】:你能改变你的最后一个 RewriteRule 来做到这一点吗?
RewriteRule ^(.*)$ $1.php [L,R=301]
这会将“myfile”重定向到“myfile.php”。
此外,您也可以在 Google Analytics(分析)中使用规则对此进行调整。虽然这可能不是一个理想的解决方案。
ETA:如果您希望 myfile.php 重定向到 myfile,请尝试将此作为您的最后一条规则:
RewriteRule ^(.+)\.php$ $1 [L,R=301]
【讨论】:
这使得 .php 页面保持为 .php。没有扩展的页面从:localhost/2008/about/management到localhost/C:/Program%20Files/Apache%20Group/Apache2/htdocs/2008/… 这不是您要找的吗?还是您希望“myfile.php”重定向到“myfile”? 是的,myfile.php 到 myfile...但它不应该将 C:/Program Files 等添加到我的 URL 中。这会创建一个无效的路径。 哎呀,不知道为什么它会在你的 URL 中添加 C:/Program Files。也许你需要一个“RewriteBase /”? 我也在寻找这个答案,但在任何地方都找不到。我得到与@CoryDee 相同的非功能性结果。【参考方案3】:你可以在你的页面中放一个
<link rel="canonical" href="..." />
https://support.google.com/webmasters/answer/139066?hl=en
【讨论】:
【参考方案4】:花了我几个小时……但我相信我终于找到了答案。
// The Original
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME\.php -f
RewriteRule ^(.*)$ $1.php
// Add This
RewriteCond %THE_REQUEST ^[A-Z]+\ /([^/]+/)*[^.#?\ ]+\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(([^/]+/)*[^.]+)\.php /$1 [R=301,L]
在这里找到:http://www.webmasterworld.com/apache/3961636.htm
【讨论】:
以上是关于URL 重写 - 不带文件扩展名的重定向的主要内容,如果未能解决你的问题,请参考以下文章
将具有单个非数字参数的动态 url 重定向到名称由参数值文本组成的静态无扩展根级 url
如果 url 扩展名为 .php,则 htaccess 重写将其删除