【问题标题】:Redirect /about to /about.php in .htaccess将 /about 重定向到 .htaccess 中的 /about.php
【发布时间】:2013-05-04 14:06:41
【问题描述】:

首先,我知道周围有很多类似的问题,但是

  1. 它们似乎都不适合我
  2. 它们都没有真正解决我想要的问题

正如标题所暗示的,我想要的是将不带.php 扩展名的URL 重定向到实际的.php 文件——如果可能的话,更改URL(我认为这只是由[R=301] 处理的)。我最近尝试的是这样的:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ $1.php [R=301]

这行不通。我仍然无法使用/about 访问/about.php。 (虽然.htaccess 规则本身运行良好)

我理解 RegEx 很好,但 htaccess 规则只是让我头疼=[

那我该怎么办?


现在我知道你在想什么了

你们中的一个人会这样说:“你为什么要这样做?完全摆脱扩展程序并通过带有斜杠的/about/about/ 访问您的页面。”

我想这样做,看起来不错。问题是搜索引擎优化——我认为我的页面排名会被消灭,因为突然之间它们在不同的 URL 上。所以在你建议之前,建议我如何保持我的页面排名第一。

我实际上在做的实际上是缩短海报的网址——人们记住mywebsite.com/about 比记住mywebsite.com/about.php 要容易得多。

【问题讨论】:

  • 您是否尝试过在重写规则中使用L 标志? RewriteRule ^(.*) $1.php [R=301,L]
  • 这不会阻止它下面的任何其他规则被执行吗?我的 .htaccess 中确实有更多规则。刚试了一下,还是不行=[
  • 我认为您不需要 [R=301],只需按照 @KristerAndersson 的建议将其替换为 [L],因为您正在屏蔽/映射
  • 还是不行!为什么是我!?我知道 mod_rewrite 肯定是通过我拥有的其他 RewriteRules 工作的 - 我尝试不使用这些其他规则,但我仍然没有效果,或者重定向循环 - 即使在清除我的浏览器缓存之后也是如此。
  • @Servant 是的,我清除了所有其他 Rewrite 代码,并在下面的答案中只使用了你的代码。我什至打开了 Internet Explorer。使用您的代码,如果我导航到/about/gallery,则会显示 404 页面。地址栏中的 URL 仍为/about/gallery

标签: .htaccess mod-rewrite


【解决方案1】:

通过httpd.conf启用mod_rewrite和.htaccess,然后把这段代码放到你.htaccessDOCUMENT_ROOT目录下:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=302,L]

# To internally forward /dir/foo/ to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

请确保您已禁用 MultiViews 选项:Options -MultiViews

一旦您确认它工作正常,请将R=302 替换为R=301。在测试你的 mod_rewrite 规则时避免使用R=301(永久重定向)。

【讨论】:

  • 这似乎也不起作用 - 我被重定向到 /dir/foo,但出现 404 错误(并且样式表中断)
  • 实际上这是来自我的网络服务器的工作代码。您能否在您的问题中发布您最新的 .htaccess 并告诉我您尝试使用哪个 URI 进行测试。同样对于样式表、JS 和图像文件,请确保您使用的是绝对路径(以斜杠或 http:// 开头)
  • 哦,CSS 问题可能是因为我有一个 PHP 脚本可以为特定浏览器生成 CSS。
  • 如果 PHP 脚本正在生成 CSS 脚本/文件,那么您可以轻松更改以生成具有绝对路径的 CSS,不是吗?
  • 我确实将其更改为 301 - 我了解重定向代码。但是,是的,正确的答案是更新链接,否则您最终会获得不必要的重定向,从而减慢网站响应时间。
【解决方案2】:

请确保您的 Apache HTTP Server 上有 mod_rewrite 并尝试以下操作:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)$ /$1.php [R]

但在检查重定向动态 URL 之前,请先清除缓存或使用其他浏览器,因为您之前使用过 [R=301] 标志!欲了解更多信息。关于这个,请访问:https://stackoverflow.com/a/15999177/2007055


你可以试试这个,但它和之前的代码完全一样:

RewriteEngine on

RewriteRule ^([a-zA-Z0-9_-]+)$ http://%{HTTP_HOST}/$1.php

当它起作用时,尝试在重写规则上方添加这两个条件:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)$ http://%{HTTP_HOST}/$1.php

如果上述任何代码都不起作用,我认为您的 Apache HTTP Server 存在问题。

【讨论】:

  • @CJxD 发生了什么? .htaccess 文件的完整来源是什么?您要重写的 URL 和 .htaccess 文件所在的根的地址是什么?您的虚拟主机帐户中有 Apache 吗?
  • 完整源代码在这里:pastebin.com/cn57JFdw .htaccess 文件的根目录是 /,实际的网址可以在该粘贴中找到,第 59 行。我正在运行 Apache,是的。此粘贴将仅在一周内有效。
  • @CJxD 您是否尝试删除 .htaccess 文件中的 ErrorDocument 404 /uhoh/404.php 第 47 行?
  • 没有帮助!当 Apache 尝试查找错误文档时,我只收到第二个 404。
  • @CJxD 请再试一次。
【解决方案3】:

这对我有用。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]

如果你愿意,你可以链接它,例如

RewriteEngine On

# Remove trailing slashes.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=permanent,QSA]

# Redirect to HTML
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

# Redirect to PHP
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]

# Redirect to ASP
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.asp -f
RewriteRule ^(.+)$ $1.asp [L,QSA]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多