我的问题:我想写一个 .htaccess 规则。
我还有其他页面,例如
www.asdf.com/city.php?city=New-York
我想显示的页面以及
我希望显示的页面www.asdf.com/New-York
www.asdf.com/country.php?country=USA
www.asdf.com/USA
www.asdf.com/state.php?country=LA
www.asdf.com/LA
很困惑如何做到这一点。
我的问题:我想写一个 .htaccess 规则。
我还有其他页面,例如
www.asdf.com/city.php?city=New-York
我想显示的页面以及
我希望显示的页面www.asdf.com/New-York
www.asdf.com/country.php?country=USA
www.asdf.com/USA
www.asdf.com/state.php?country=LA
www.asdf.com/LA
很困惑如何做到这一点。
如果您希望 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/USA
for country.php?country=USA
、/state/LA
forstate.php?country=LA
和/city/New-York
for 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]