htaccess重写“../pages/about.php“改为”../关于”


htaccess rewrite ".../pages/about.php" to ".../about"

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

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

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

注意:我正在使用Rackspace Cloud托管,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导演(自托管(的SlideShowPro(flash(作为它的后端。当它拉出一个新图像时,它会在/weddings 之后添加以下内容......"#id=专辑-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是给定部分中唯一会更改的内容?

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

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

例如,您希望发出 www.kurtiskronk.com/* 到 kurtiskronk.com/* 的永久重定向。 假设您只从此树中服务器基本域和 www 子域,那么这个 cond/规则对应该排在第一位,这样您就可以假设所有其他规则只引用 kurtiskronk.com

接下来,您需要查看 RewiteBase 文档。 .htaccess文件在 Apache 所谓的每目录上下文中处理,此指令告诉重写引擎将什么作为到达此目录和 .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 的服务器或环境表中添加一些字段转储查找 REDIRECT_*,以查看这些是否合理。例如:

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

您的下一个规则是,如果该文件存在于子目录页面中,则使用它:

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

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

您的下一个规则是,如果文件存在,但在子目录页面中具有扩展名.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使用/tag/downtown/作为PATH_INFO执行。 但这是Wordpress专家可以评论的一个。 如果最后一个规则不起作用,请尝试:

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

附言。 我喜欢你的网站。 我希望我又那么年轻:(

附言

当你说"它不起作用"时,这个.htaccess有什么不行的?

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

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

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

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

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

必须启用mod_rewrite。

例如,在 DocumentRoot 中使用 .htaccess:

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

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

Options +FollowSymLinks
RewriteEngine On
RewriteRule /([0-9]+)$ /pages/$1.php [L]

在你的.htaccess文件中放这样的东西。我想这就是你想要的。从简单网址重定向到较长的网址。