使用.htaccess更改网址[域名/ cms.php?iCmsId = 1转换为域名/ about-us.php]

时间:2012-02-20 10:15:39

标签: php .htaccess

我需要更改网页网址的显示

我的网页上有cms.php?iCmsId=1cms.php?iCmsId=2cms.php?iCmsId=3等网址。 现在我想要cms.php?iCmsId=1,然后网址将是www.test.com/about-us.phpwww.test.com/about-us.html

3 个答案:

答案 0 :(得分:0)

这会将用户重定向到about-us.html

RewriteRule ^cms.php?iCmsId=1$ /about-us.html [R=301,L]
RewriteRule ^cms.php?iCmsId=2$ /about-us.html [R=301,L]

答案 1 :(得分:0)

我认为您对此感兴趣:

RewriteEngine On
RewriteCond %{REQUEST_URI} .html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^about-us.html cms.php?iCmsId=1 [PT]

这意味着:

  1. 激活重写引擎
  2. 如果客户请求html页面
  3. 如果服务器上不存在该文件
  4. 如果网址为about-us.html,则访问cms.php?iCmsId=1
  5. 如果你想选择像

    这样的东西
    RewriteRule ^about-us-([0-9]+).html cms.php?iCmsId=$1 [PT]
    

    这将匹配任何网址:about-us-324.html并实际访问您的网页,如:cms.php?iCmsId=324

    这是你要问的吗?

    P.S:Chris告诉你如何使用.htaccess进行301重定向

答案 2 :(得分:0)

.htaccess黑客的一个更强大的技巧是重写URL的能力。这使我们能够对我们的链接进行一些强大的操作;有用的东西,比如将很长的网址转换为简短可爱的网址,将动态生成=页面和网址转换为/友好/平面/链接,重定向丢失的网页,防止热链接,执行自动语言翻译还有更多。

毫无疑问,mod_rewrite很复杂。这不是一个快速一口大小的技术小吃的主题,可能甚至不是一个周末的速成课程,我已经看到有些人用mod_rewrite推出一些真正可爱的东西,但是带着荣誉帽子这个神奇模块本身的作者Ralf S. Engelschall坚定地向那个混蛋操作者倾斜,我不得不承认,对我来说,很多东西似乎仍然是巫术。

规则可以工作一分钟然后看起来不是下一个,浏览器和其他中间网络缓存如何与规则和测试规则交互往往令人困惑,令人抓狂。当我觉得有必要让我的思绪完全变形时,我会乱用mod_rewrite!

毕竟,它确实有效,虽然我不打算很快就开始参加那个周末的速成课程,但我自己也搞砸了一些小动作,弄乱了网络服务器和网络网站,这个地方..

这里的计划是删除一些简洁的东西,例子,已经证明有用的东西,并且可以处理各种服务器设置;在我的局域网中有Apache,我不断遇到旧的.htaccess文件,这些文件塞满了过去的重写实验,这些实验都有效;我将它们添加到我的列表中,或者失败了;这些天我经常感到惊讶,我可以确切地知道为什么!

这里很少是我自己的发明。即便是我自己弄清楚的那些内容已经有了很好的记录,我只是不了解这些文件,或者找不到它们。有时,只是从不同的角度看待同样的事情可以产生重大影响,所以也许这种对URL重写的简单抨击可能会有所帮助。当然,我正在为我写这篇文章。但我确实得到了一些赞誉......

获得动态的时间,请参阅..

RewriteRule(。*)。htm $ 1.php

开始重写..

Whenever you use mod_rewrite (the part of Apache that does all this magic), you need to do..

每个.htaccess文件只需要执行一次:

Options +FollowSymlinks
RewriteEngine on

..在任何ReWrite规则之前。注意:必须启用+ FollowSymLinks才能使任何规则生效,这是重写引擎的安全要求。通常它在root中启用,你不应该添加它,但这样做并没有什么坏处,我会将它插入到本页的所有示例中,以防*。

下一行只是打开该文件夹的重写引擎。如果这个指令在你的主.htaccess文件中,那么ReWrite引擎理论上已经为你的整个站点启用了,但是在任何地方写任何重定向之前总是添加该行是明智的。

  • 虽然可能性很小,但您的主机可能在根级别启用了+ FollowSymLinks,但不允许在.htaccess中添加它;在这种情况下,添加+ FollowSymLinks将破坏您的设置(可能是500错误),所以只需删除它,您的规则应该正常工作。

重要提示:虽然此页面上的某些指令可能会在浏览器中显示为两行,但在.htaccess文件中,它们必须完全存在于一行中。如果您在此页面上拖放选择并复制指令,它们应该很好地粘贴到任何文本编辑器中。

简单重写

简而言之,Apache会扫描所有传入的URL请求,检查.htaccess文件中的匹配项,并将这些匹配的URL重写为我们指定的任何内容。像这样......

对whatever.htm的所有请求都将发送到whatever.php:

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(.*)\.htm$ $1.php [NC]

任何人都可以从静态htm(你可以使用.html或.htm(。*),. htm?等)更新网站到动态php页面;对旧页面的请求会自动重写到我们的新网址。没有人注意到一件事,访问者和搜索引擎都可以访问你的内容。把规则留在;作为一个额外的好处,这使我们能够轻松地将PHP代码及其包含的html结构分成两个单独的文件,这是个不错的主意;使编辑和更新变得轻而易举。最后的[NC]部分表示" No Case"或"不区分大小写&#34 ;;更多关于开关,稍后。

人们可以链接到whatever.htm或whatever.php,但是他们总是在浏览器中获得whatever.php,即使what.htm不存在,这也有效!但我迷失了......

目前看来,它有点棘手;人们仍然会在他们的浏览器地址栏中找到.htm,并且仍然会为旧的.htm网址添加书签。搜索引擎也将继续将链接编入索引为.htm,有些甚至认为从两个不同的地方提供相同的内容可能会让你受到搜索引擎的惩罚。这可能会或者不会打扰你,但如果确实如此,mod_rewrite可以做更多的魔术......

这会做一个真实的"外部重定向:

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(.+)\.htm$ http://xxxx.org/$1.php [R,NC]

不那么简单的重写...平面链接和更多 您可能已经注意到,上面的示例使用正则表达式来匹配变量。这简单的意思是..匹配里面的部分(。+)并用它来构造" $ 1"在新网址中。换句话说,(。+)= $ 1你可以拥有多个(。+)部分,并且每个部分,mod_rewrite会自动在你的目标中创建一个匹配的$ 1,$ 2,$ 3等(又名。'替换' )URL。这个设施使我们能够做各种各样的技巧,其中最常见的是创建"扁平链接" ..

即使像http://mysite/grab?file=my.zip这样可爱的短链接对于某些人来说也太难看了,而且真正的老式固体领域/路径/平面/链接都可以做到。幸运的是,mod_rewrite可以很容易地将带有查询字符串和多个变量的URL转换为完全相同的内容,例如..

更复杂的重写规则:

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^files/([^/]+)/([^/]+).zip /download.php?section=$1&file=$2 [NC]

允许您将此链接显示为..

<强> HTTP://mysite/files/games/hoopy.zip

并且在后台将服务器端透明地翻译为..

<强> HTTP://mysite/download.php部=游戏&安培;文件= hoopy

某些脚本可以处理的

你看,很多搜索引擎都不遵循我们的?generated =链接,所以如果你创建生成页面,这很有用。然而,它只是那些无法处理这类链接的愚蠢的搜索引擎;我们不得不问自己..我们真的想被愚蠢的搜索引擎列出吗?谷歌会在你的网址中处理好一些参数而不会出现任何问题,而且(饥肠辘辘的)msn-bot会立即停止获取该页面,有时会一次又一次......

我个人认为应该努力跟上现代网络技术的搜索引擎,换句话说;我们不应该为他们愚蠢。但那只是我的意见。许多用户更喜欢/files/games/hoopy.zip到/download.php?section=games&file=hoopy但我不介意。正如最近有人向我指出的那样,将链接显示为标准/平面/路径意味着您不太可能让人们在输入的网址中输入拼写错误,所以就像......

更复杂的重写规则:

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^blog/([0-9]+)-([a-z]+) http://corz.org/blog/index.php?archive=$1-$2 [NC]

Escaping:

\char escape that particular char

    For instance to specify special characters.. [].()\ etc.

Text:

.             Any single character  (on its own = the entire URI)
[chars]       Character class: One of following chars
[^chars]      Character class: None of following chars
text1|text2   Alternative: text1 or text2 (i.e. "or")

    e.g. [^/] matches any character except /
         (foo|bar)\.html matches foo.html and bar.html

Quantifiers:

? 0 or 1 of the preceding text
* 0 or N of the preceding text  (hungry)
+ 1 or N of the preceding text

    e.g. (.+)\.html? matches foo.htm and foo.html
         (foo)?bar\.html matches bar.html and foobar.html

Grouping:

(text)  Grouping of text

    Either to set the borders of an alternative or
    for making backreferences where the nthe group can 
    be used on the target of a RewriteRule with $n

    e.g.  ^(.*)\.html foo.php?bar=$1

Anchors:

^    Start of line anchor
$    End   of line anchor

    An anchor explicitly states that the character right next to it MUST 
    be either the very first character ("^"), or the very last character ("$")
    of the URI string to match against the pattern, e.g.. 

    ^foo(.*) matches foo and foobar but not eggfoo
    (.*)l$ matches fool and cool, but not foo