【发布时间】:2014-08-12 08:50:19
【问题描述】:
我整天都在寻找一种解决方案,用 .htaccess 将 URL 中的 .php 替换为 /。大多数解决方案根本不适合我(没有重写 URL,甚至只是删除 .php),直到我在 SO 上找到了这个漂亮的解决方案。
https://stackoverflow.com/a/11084526/1724376
现在我的问题是它只删除了 .php 但没有用“/”替换它。我尝试了很多没有运气的事情,但我对htaccess和重写条件等了解不多。我真的希望这里有人可以帮助我。
为了避免因为没有尝试任何东西而被否决,这是我尝试过的一个,但它根本没有重写 URL。
RewriteCond /%{REQUEST_FILENAME}.php -f
RewriteRule ^([a-zA-Z0-9_-\s]+)/$ /$1.php
我们将不胜感激。
编辑:澄清一下,我希望 www.mysite.com/contact.php 显示为 www.mysite.com/contact/
【问题讨论】:
-
很多人忽略了这样一个事实,即您可以使用 mod_rewrite 设置两种基本类型的规则;通常,你想要两者。一种类型将漂亮的 URL 输入浏览器,然后计算应该提供的丑陋版本,但对浏览器完全不可见;另一种类型采用旧的丑陋 URL,并 告诉浏览器 转到漂亮的 URL。第二种类型仅在您使用第一种类型时才有用。您在此处发布的规则是第一种类型 - 如果您转到以
/结尾的 URL,它将尝试提供 PHP 文件,但它不会以任何方式重定向浏览器。跨度> -
谢谢,是的,这是有道理的。我猜那些带有 [R=301] 的人会进行 301 重定向。这导致我尝试 RewriteRule (.*)\.php$ $1/ [R=301] 但当然这不起作用,因为当我尝试访问 example.com/test/ 时不存在 example.com/test .php。仍在寻找解决方案,但至少这引发了更多想法:)
-
是的,
[R=301]表示 301 HTTP 重定向;如果没有[R]标志,重写是内部的,你会经常看到[L],意思是“最后一个”,以停止两个规则同时触发(它们是按顺序处理的,所以另一个选项是要小心如何你列出它们)。您说“当然 ... example.com/test/ 不存在”-这就是您在此处粘贴的规则的重点,以使该 URL 存在。我的建议:如果您首先直接链接到“漂亮”的 URL,则让它们正常工作,然后担心如果他们访问“旧”/“丑陋”的 URL,则会重定向他们的浏览器。 -
使 URL 存在正是我想要避免的。那是几天的工作,然后重新测试整个站点以确保一切正常。我希望 htaccess 能成为这里的解决方案。我需要做的就是让 example.com/test.php 可以作为 example.com/test/ 访问,原因有两个 - 1)漂亮的 URL,2)混淆的安全性(我知道这不好,但它可以'不疼)。
-
我很困惑:“使 URL 存在”和“让 example.com/test.php 可以作为 example.com/test/ 访问”是一回事!如果您可以访问
example.com/test/,它就存在(就浏览器而言)。然后你可以做任何你喜欢告诉浏览器加载该页面的事情(例如,从“旧” URL 放置 301 重定向)。
标签: regex apache .htaccess mod-rewrite