2

我的问题:我想写一个 .htaccess 规则。 我还有其他页面,例如 www.asdf.com/city.php?city=New-York我想显示的页面以及 我希望显示的页面www.asdf.com/New-Yorkwww.asdf.com/country.php?country=USAwww.asdf.com/USAwww.asdf.com/state.php?country=LAwww.asdf.com/LA

很困惑如何做到这一点。

4

1 回答 1

0

如果您希望 3 个完全不同的事物具有相同的 url,您将不得不使用 php 页面来“检测”它是什么类型的“事物”并将您的请求“路由”到特定页面。

以下(未经测试的)两条规则会将上面列出的所有“丑陋”url 重定向到一个花哨的 url,并将花哨的 url 重定向到一个 php 页面,该页面确定它应该用于请求的页面。%2是对 RewriteCondition 中的第二个捕获组的反向引用。尾随?清除查询字符串。

RewriteCond %{QUERY_STRING} (city|country)=([^&]*)
RewriteRule (country\.php|city\.php|state\.php) %2? [R=301,L]

RewriteRule ^([^/]*)$ myRouter.php?url=$1 [END]

使用类似以下内容的文件myRouter.php

<?php
  $url = $_GET['url'];

  if( isCity( $url ) ) {
    $city = $url;
    include( 'city.php' );
    exit();
  } elseif( isCountry( $url ) ) {
    $country = $url;
    include( 'country.php' );
    exit();
  }
  #etc....
?>

更合乎逻辑的是为不同的事物使用不同的花哨的 url,例如/country/USAfor country.php?country=USA/state/LAforstate.php?country=LA/city/New-Yorkfor city.php?city=New-York

这可以通过以下(未经测试的)htaccess 轻松完成,并生成更多逻辑 URL:

RewriteCond %{QUERY_STRING} (city|state|country)=([^&]*)
RewriteRule ^(country|city|state)\.php$ $1/%2? [R=301,L]

RewriteRule ^(country|city|state)/(.*)$ $1.php?$1=$2 [END]
于 2013-07-19T16:37:06.540 回答