【问题标题】:Friendly Url .htaccess友好的网址 .htaccess
【发布时间】:2012-10-15 05:31:13
【问题描述】:

我已尝试按照.htaccess short and friendly url 上的说明进行操作,但无法达到这些结果。

如果我使用以下它可以正常工作:

RewriteEngine On
RewriteRule ^([^/]*)\.html$ /index.php?page=$1 [L]

但是,如果我使用:

RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]

我收到内部服务器错误。

我想要实现的只是能够使用http://website.com/about 而不是http://website.com/about.html

【问题讨论】:

  • 是页面本身 .html 或 php 被告知显示为 .html
  • RewriteRule ^([^/]*)$ index.php?page=$1 [L] 在 index.php 可能解决您的问题之前删除“/”。
  • 我有一个位于sample.com/index.php 的页面。我通过将 ?page=home 添加到它的末尾来将变量传递给它。我希望能够改用sample.com/home

标签: .htaccess url friendly-url


【解决方案1】:

这些规则:

RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]

导致内部重写循环。重写引擎循环遍历所有规则,直到达到内部重定向限制(从而导致 500 服务器错误)或从引擎出来的结果 URI 与进入它的 URI 相同。此外(这是一个非常重要的概念),在将 URI 的前导斜杠发送到 htaccess 文件中的规则的重写引擎之前,它会被删除。所以我们有:

  1. 发出请求:http://domain.com/blah
  2. URI = /blah
  3. 去除前导斜杠,URI = blah
  4. blah 匹配 ^([^/]*)$,应用规则,URI = /index.php?page=blah
  5. blah 不等于 /index.php
  6. 规则循环,URI = /index.php
  7. 去除前导斜杠,URI = index.php
  8. index.php 匹配^([^/]*)$,应用规则,URI = /index.php?page=index.php
  9. index 不等于 /index.php
  10. 规则循环,URI = /index.php
  11. 去除前导斜杠,URI = index.php
  12. index.php 匹配^([^/]*)$,应用规则,URI = /index.php?page=index.php
  13. index 不等于 /index.php

等等

你有几个选择来处理这个问题。最简单的方法是从目标中删除 /

RewriteRule ^([^/]*)$ index.php?page=$1 [L]

这将使得在上面的第 9 步中,index 将等于 index.php,从而停止重写过程(在第二次应用之前)。唯一的缺点是如果您需要重定向,或者如果 htaccess 文件被移动,目标中的相对 URI 有时会被误认为是文件路径而不是 URL 路径(apache 猜测这个,有时 apache 猜测错误的)。这可以通过包含一个基础来解决:

RewriteBase /
RewriteRule ^([^/]*)$ index.php?page=$1 [L]

您还可以添加条件以使其指向现有资源的 URL 将排除此规则的应用:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]

因此,如果 URI 指向现有文件或目录,则跳过该规则。因此,在 URI 变为 /index.php 时第一次重写后,由于该文件存在,因此第二次跳过该规则。这也使得对文档根目录中的图像、css、脚本或静态页面的请求不会通过index.php 路由。如果这不是您想要的,如果 URI 已经是 index.php,您也可以直接跳过:

RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]

【讨论】:

  • 我不知道为什么我在发布此邮件时没有收到电子邮件。我今晚会检查以确认它是否正常工作。
  • 谢谢你,但是,我仍然无法达到我想要的结果。
猜你喜欢
  • 2016-03-11
  • 2017-05-14
  • 2014-07-26
  • 2010-10-24
  • 2012-04-27
  • 2012-08-14
  • 2016-02-02
  • 1970-01-01
相关资源
最近更新 更多