【问题标题】:htaccess rewrite ".../pages/about.php" to ".../about"htaccess 将“.../pages/about.php”重写为“.../about”
【发布时间】:2012-02-01 00:22:51
【问题描述】:

我在这个网站和其他地方搜索并发现了很多非常相似的问题,但我已经尝试实施和修改我发现的所有建议,但没有一个有效。我意识到这是一个非常基本的问题,我非常沮丧,因为我正在尝试的任何方法都不起作用。

话虽如此...我正在尝试在 kurtiskronk.com/pages/... 中组织我的内容页面...(例如 kurtiskronk.com/pages/about.php)

我想要做的是让我可以简单地链接到 kurtiskronk.com/about ... 那么我该如何剥离“pages/”和“.php”呢?我没有大量的内容页面,所以如果我必须为每个页面指定内容,这没什么大不了的,尽管动态的东西会很方便。

注意:我正在使用 Rackspace 云托管,并且 WordPress 安装在 /blog 中。我的 phpinfo() 可以在http://kurtiskronk.com/pages/phpinfo.php看到

这是我现有的 .htaccess 文件(在根目录中)

php_value register_globals "on"
Options +FollowSymLinks
RewriteEngine On

#301 redirect to domain without 'www.'
RewriteCond %{HTTP_HOST} ^www\.kurtiskronk\.com$ [NC]
RewriteRule ^(.*)$ http://kurtiskronk.com/$1 [R=301,NC]
RewriteBase /

RewriteCond %{ENV:PHP_DOCUMENT_ROOT}/pages/$1  -f
RewriteRule ^(.*)$     pages/$1  [L]

RewriteCond %{ENV:PHP_DOCUMENT_ROOT}/pages/$1.php  -f
RewriteRule ^(.*)$     pages/$1.php  [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^blog/ blog/index.php [L]

# PHP - MAIL
php_value mail.force_extra_parameters -kurtis@kurtiskronk.com

我测试并且重写与下面的行一起工作(/about 作为 URL 带来文件 /pages/about.php),但随后主页给出了 500 内部服务器错误:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /pages/$1.php [L]

所以我仍然和以前一样,作为一个后续问题,可能更困难的问题,如果你去http://kurtiskronk.com/weddings我正在使用带有 SSP Director 的 SlideShowPro (flash) (self-托管)作为它的后端。当它拉出一个新图像时,它会在 /weddings ... "#id=album-152&num=content-9698" 之后添加以下内容

投资组合有四个部分

# Homepage (kurtiskronk.com) id=album-148 ($id is constant for this section)
# Weddings (/weddings) id=album-152 ($id is constant for this section)
# Portraits (/portraits) id=album-151 ($id is constant for this section)
# Commercial (/commercial) id=album-150 ($id is constant for this section)

假设我们让 kurtiskronk.com/weddings 成功重写而不会破坏任何内容,我们如何使整个 URL 更清晰 kurtiskronk.com/weddings/9698 因为 $num 是给定部分中唯一会改变的东西?

【问题讨论】:

  • 也许您可以先从右侧丢失的相关问题开始扫描,然后找到能回答您问题的问题。抱歉,这是一个非常 i> 基本和常见问题。
  • Terry 我很感激这对你来说是一个菜鸟问题,但我实际上浏览了大约 30 篇相关帖子(在过去 2 天在谷歌上查找并阅读了 htaccess 文件和重写规则之后)和我找到的解决方案中没有一个对我有用。如果这对您来说如此微不足道,我真诚地希望您能协助完成这项工作。
  • 为什么在根 .htaccess 中使用“RewriteBase /blog/”,而不是在 blog/.htaccess 中?

标签: php .htaccess directory rewrite


【解决方案1】:

Kurtis,感谢您提供的额外信息。对此给出具体答案要容易得多。

我的第一条评论是,您需要在您的思考 URI 空间中分离出来——这是您希望用户在浏览器中键入的 URI——以及文件系统空间——您想要映射到的物理文件。您的一些映射是 URI->URI 和一些是 URI->FS

例如,您希望将 www.kurtiskronk.com/* 永久重定向到 kurtiskronk.com/*。假设您只为这棵树中的 base 和 www 子域提供服务,那么这个条件/规则对应该首先出现,这样您就可以假设所有其他规则只引用 kurtiskronk.com。

接下来,您需要查看RewiteBase documentation.htaccess 文件在 Apache 所称的 Per-Directory 上下文中进行处理,该指令告诉重写引擎假设什么作为到达该目录和 .htaccess 文件的 URI 基础。据我所知,您的博客安装在 docroot/blog 中(在文件系统中,并且您想通过输入 http://kurtiskronk.com/blog/ 进入目录,但是这个 .htaccess 文件是用于根文件夹的——这应该是基础是(这在 www 映射规则之前)

DirectorySlash On
DirectoryIndex index.php
RewriteBase /

#301 redirect to domain without 'www.'
RewriteCond %{HTTP_HOST} ^www\.kurtiskronk\.com$ [NC]
RewriteRule ^(.*)$ http://kurtiskronk.com/$1 [R=301,NC]

您可以添加一些字段转储,在 phpinfo O/P 的 Server 或 Environment 表中查找 REDIRECT_* 以查看这些是否合理。例如:

RewriteWrite ^(.*)$   - \
[E=TESTDR:%{DOCUMENT_ROOT}/pages/$1.php,E=TESTPDR:%{DOCUMENT_ROOT}/pages/$1.php]

您的下一条规则是,如果文件存在于子目录 pages 中,则使用它:

RewriteCond %{DOCUMENT_ROOT}/pages/$1  -f
RewriteRule ^(.*)$                     pages/$1  [NS,L]

[请注意,某些共享服务站点没有为重写引擎正确设置 DOCUMENT_ROOT,因此您可能需要运行 variableinfo 脚本(<?php phpinfo(INFO_ENVIRONMENT | INFO_VARIABLES); 以查看它是否设置了替代方案。在您的站点上,您必须使用 @ 987654332@ 代替。]

您的下一条规则是,如果文件存在,但在子目录 pages 中具有扩展名 .php,则使用它:

RewriteCond %{DOCUMENT_ROOT}/pages/$1.php  -f
RewriteRule ^(.*)$     pages/$1.php  [NS,L]

现在将所有博客引用重定向到博客子目录,除非 URI 映射到真实文件(例如博客样式表和您的上传文件)。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^blog/ blog/index.php [L]

这里的一个复杂之处是,WP 可能使用了一个记录不充分的 Apache 功能调用路径信息,这是一个脚本可以充当伪目录,因此 http://kurtiskronk.com/blog/tag/downtown/ 被重定向到 docroot/blog/index.php/tag/downtown/,然后由 `docroot/blog/index.php 使用 @ 执行987654337@ 作为 PATH_INFO。但这是一个供 Wordpress 专家评论的问题。如果最后一条规则不起作用,请尝试:

RewriteRule ^blog/(.*) blog/index.php/$1 [L]

PS。我喜欢你的网站。我真希望我能再年轻一次:(

后记

当你说“它不起作用”时,这个.htaccess 有什么不妥之处?

  1. http://kurtiskronk.com/phpinfo,
  2. http://kurtiskronk.com/phpinfo.php,
  3. http://kurtiskronk.comblog/tag/downtown/

只是这些规则适用于我的这些测试(域交换)。 (一种方法是将上面的variableinfo.php 移动或复制到各个子目录。如果需要,暂时将 index.php 重命名为 index.php.keep,然后将variableinfo.php 复制到 index.php 文件中。您可以现在输入各种 URI 测试模式,看看发生了什么。在 phpinfo 输出中查找 REDIRECT_* 字段,SCRIPT_NAME 会告诉你正在执行哪个。你可以添加更多 {E=...] 标志来检查各种模式结果。(请记住,只有在规则匹配时才会分配这些标志。

最后请注意上面的更改,尤其是附加的 NS 标志。由于某种原因,mod_rewrite 直接进入子查询,导致redirect: 被转储到文件模式中。我查看了 Apache 代码,这是一个内部错误,用于标记需要进行进一步重定向(然后替换它或退出)。然而this open bug 表示在子查询中可能会错过这个退出,也许这就是这里发生的事情。当然,添加 NS flas 可以解决我的测试环境中的问题。

PS。请注意添加的显式DirectoryIndex 指令,并且虽然http://kurtiskronk.com 将运行根index.php,但显式/index.php 版本将运行分页,因为这就是您的规则所说的。

【讨论】:

  • 感谢您花时间详细回答,特里。我忘记了为什么要按原来的方式设置 htaccess,但它是针对旧设计的,其中博客是首页...无论如何,我已经实施了您的建议,但我仍然无法得到它去工作。查看我的 phpinfo() 结果,我不清楚该怎么做。我已经尝试了其他几种方法,例如 %ENV:PHP_DOCUMENT_ROOT 等,但我不确定我在寻找什么,所以这只是猜测。 kurtiskronk.com/phpinfo.php
  • 查看您的信息文件,看起来您在 mod_php5 下运行在您自己的专用 VM 上,这意味着您应该有权访问根 apache 配置('/etc/apache2/apache2.conf ') 并且可以启用重写日志记录。您还可以访问~/logs/php_errors.log 中的 PHPerror 日志。让我看看启用了 mod_php5 的配置并回复你:)
  • Terry,显然,为了 Rackspace 的整体安全/完整性,我真的无法访问这些东西,但如果有任何帮助,他们确实为我提供了这个链接......rackspace.com/knowledge_center/index.php/…
  • phpinfo 位于根目录,而不是 /pages
  • 成功!!!!特里,你真棒。我还没有弄清楚到底做了什么不同,但它现在可以正常工作,而不会破坏我迄今为止注意到的任何东西。
【解决方案2】:

这是一个简单的解决方案。您可以在 apache conf 文件或 .htaccess 中使用它(尝试时更容易设置)。

必须启用 mod_rewrite。

例如,在 DocumentRoot 中使用 .htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /pages/$1.php [L]

它将 /about 重定向到 /pages/about.php 和任何其他页面。 “RewriteCond”部分是授权对现有文件的访问(例如:如果您在站点的根目录中有一个“about”文件,那么它将被提供,而不是重定向到 /pages/about.php)。

【讨论】:

  • 这两种解决方案最终都会显示标准的 WordPress“未找到,请尝试搜索”页面。 (WordPress 安装在 /blog)
  • 好的,你没有告诉我们你已经安装了 WP 并且已经 RewriteRules。它改变了一切。 “RewriteRule ./blog/index.php [L]”这一行(几乎)捕获了所有内容。并且 RewriteCond 仅适用于下一个 RewriteRule(除非后面有更多 RewriteConds)。尝试向上移动我给你的两行(条件/规则)。
  • Ooooo... 结合清理我的 htaccess 文件,这就是诀窍!使用更新的工作 htaccess 代码编辑我的问题!
  • ^ 激动地发帖后,我意识到它在重写的同时,它也破坏了主页...... doh!
【解决方案3】:
Options +FollowSymLinks
RewriteEngine On
RewriteRule /([0-9]+)$ /pages/$1.php [L]

在您的 .htaccess 文件中添加类似的内容。我想这就是你想要的。 只是从一个简单的 url 重定向到一个更长的 url。

【讨论】:

  • 这两种解决方案最终都会显示标准的 WordPress“未找到,请尝试搜索”页面。 (WordPress安装在/blog)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 2016-01-27
  • 2015-12-13
  • 1970-01-01
  • 2012-10-13
  • 2013-07-04
相关资源
最近更新 更多