【问题标题】:Htaccess rewrite rule .aspx to .phpHtaccess 将规则 .aspx 重写为 .php
【发布时间】:2011-02-13 09:37:15
【问题描述】:

背景:我有一个使用 ASP.NET 2.0 构建并在 Windows 主机上的网站。我现在必须用 PHP 重写我的网站并将其移至 Linux 托管。我有很多来自网络的传入链接,这些链接直接指向旧的 .aspx 页面。网站本身很简单,一个动态页面,五个静态页面。

我将静态 .aspx 页面保存为 .php-pages 并用 PHP 重写了动态页面。动态页面名为 City.aspx,我用 PHP 编写,现在名为 City.php。

在我的旧 Windows 主机上,我使用 ASP.NET 的 URL 映射来获得友好的 URL。例如,Laajakaista/Ypaja.aspx 的传入 URL 请求被映射到 City.aspx?CityID=981。

我的目标: 将所有寻找旧 .aspx 页面的人类访问者和搜索引擎重定向到新的 .php 页面。

我认为将访问者重定向到新页面的最简单方法是进行重定向,其中对 .aspx 文件的所有请求都将被重定向到 .php 文件类型。

因此,如果有人要求 MYSITE/City.aspx?CityID=5,他们将被带入 MYSITE/City.php?CityID=5。

但是,我在让它工作时遇到了很多麻烦。

到目前为止,这是我发现的:

rewriterule ^([.]+)\.aspx$ http://www.example.com/$1.php [R=301,L] 

但是,我认为这不能处理文件类型之后的参数,我也不太确定要放在前面。

为了让事情变得更复杂一些,在我之前的网站上,我使用了友好的 URL,因此我有一个巨大的映射文件,其中包含如下映射:

    <add url="~/Laajakaista/Ypaja.aspx" mappedUrl="~/City.aspx?CityID=981" />
    <add url="~/Laajakaista/Aetsa.aspx" mappedUrl="~/City.aspx?CityID=988" />
    <add url="~/Laajakaista/Ahtari.aspx" mappedUrl="~/City.aspx?CityID=989" />
    <add url="~/Laajakaista/Aanekoski.aspx" mappedUrl="~/City.aspx?CityID=992" />

我尝试像这样进行简单的重定向:

Redirect 301 Laajakaista/Aanekoski.aspx City.php?CityID=992

但无法让它工作。我最终遇到了内部服务器错误和 50k .htaccess-file...

非常感谢任何帮助。

【问题讨论】:

    标签: php asp.net .htaccess url-rewriting friendly-url


    【解决方案1】:

    您真的要在 htaccess 文件中进行城市名称/ID 转换吗?

    通常的方法是匹配 Laajakaista/*.aspx 并将地名作为参数传递给 PHP 脚本(然后将其转换为 ID)。那不是更好的主意吗?

    如果这是一个选项,你会做这样的事情:

    rewriterule ^Laajakaista/([.]+)\.aspx$ city.php?cityname=$1 [QSA]
    rewriterule ^([.]+)\.aspx$ $1.php?%{QUERY_STRING} [R=301,QSA]
    

    您可以使用或不使用 301 来执行此操作 - 301 将更改浏览器中可见的 URL。

    【讨论】:

    • 这将解决我的第二个问题。但是,我仍然会收到很多对不存在的 .aspx 页面的请求,这些页面现在可以作为类似名称的 .php 页面找到。关于第一个问题的任何想法?
    • @Markus 是否都与城市名称在同一个目录中?
    • @Markus 如果它们在同一个目录中,您可以构建一个 PHP 前端控制器(例如 index.php 而不是 city.php)并决定在该 index.php 中做什么:如果文件cityname.php 存在,包括,如果不存在,则搜索该名称的城市,如果也失败,则发送 404。它不太优雅,但如果您出于 SEO 原因需要保留现有结构一段时间,我会说没关系。只要重写规则仅适用于 aspx 文件,而不适用于图像等任何其他资源,从性能的角度来看也是可以的。
    • 我还想告诉谷歌这些页面现在可以在另一个地方找到,因此是 301。所以,我有两个问题: 1. 将对 .aspx-pages 的所有请求重定向到类似名称带有参数的 .php 页面。 (City.aspx?CityID=1 -> City.php?CityID=1) 2. 将对 Laajakaista/[Cityname].aspx 的所有请求重定向到针对 City.php?CityID=X 的相应查询,其中 CityName 与 CityID 匹配。
    • @Markus 对于第一个问题,也可以考虑完全摆脱文件扩展名或使用htm(l)。无论如何,phpaspx 在内容类型方面毫无意义。
    【解决方案2】:

    尝试将 QSA 添加到标志中,使其成为 [R=301,L,QSA]。这代表“Query String Append”,并将旧 URL 中的所有查询字符串附加到新 URL。这应该可以解决文件名后的参数问题。

    RewriteRule ^(.*)\.aspx$ http://www.example.com/$1.php [R=301,L,QSA]
    

    至于其他映射,您可能需要重新考虑您的方法。为每个城市绘制地图似乎很混乱。您可能应该将城市名称作为参数传递给 city.php 文件并将其从名称转换为 ID。那么它只是 .htaccess 文件中的一个 RewriteRule 条目,而不是每个城市的重定向。例如,

    RewriteRule ^Laajakaista/(.*)\.aspx$ city.php?cityname=$1 [L]
    

    【讨论】:

    • 我无法传入 .aspx 文件,因为我没有 ASP.NET 来运行 .aspx 文件。我现在在一个 Linux 主机上,有很多以 .aspx 结尾的指向我的域的传入链接。对于我对这种情况的混乱解释,我深表歉意。
    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 2014-06-30
    • 2016-08-09
    • 2012-08-22
    • 1970-01-01
    • 2011-10-22
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多