使用.htaccess美化URL

使用.htaccess美化URL,.htaccess,url,url-rewriting,pretty-urls,.htaccess,Url,Url Rewriting,Pretty Urls,在搜索更为用户友好的URL时,如何仅使用.htaccess优雅地实现以下两项 /de/somepage 转到/somepage?ln=de /zh CN/somepage#7 转到/somepage?ln=zh CN#7 总结: /[语言]/[pagefilenameWithoutExtension][可选锚定#][0-9之间的数字] 应加载(不更改url) /[PageFileName WithOutExtension]?ln=[language][optional anchor#][0-9之

在搜索更为用户友好的URL时,如何仅使用.htaccess优雅地实现以下两项

/de/somepage
转到
/somepage?ln=de

/zh CN/somepage#7
转到
/somepage?ln=zh CN#7

总结:
/[语言]/[pagefilenameWithoutExtension][可选锚定#][0-9之间的数字]

应加载(不更改url)
/[PageFileName WithOutExtension]?ln=[language][optional anchor#][0-9之间的数字]

在提供解决方案后更新: 1.异常/zh CN/somepage应可作为/CN/somepage访问 2.php生成的缩略图现在不再加载,如:

img src=“imgcpu?src=someimage.jpg&w=25&h=25&c=f&f=bw”

我建议如下-

RewriteEngine on
RewriteRule ^([a-z][a-z])/([a-zA-Z]+) /$2?ln=$1
RewriteRule ^([a-z][a-z])/([a-zA-Z]+#([0-9])+) /$2?ln=$1$3
第一条规则处理像/de/somepage这样的URL。语言应该正好是两个字符 长度,并且只能包含a到z个字符

第二条规则处理像/uk/somepage#7这样的URL

您不需要对片段执行任何操作(例如:
#7
)。它们不会被发送到服务器。它们完全由浏览器处理

更新: 如果您真的想将zh CN视为一个特例,您可以执行以下操作:

RewriteRule ^zh-CN/(.*) /$1?ln=zh-CN [L]
RewriteRule ^cn/(.*) /$1?ln=zh-CN [L]
RewriteRule ^([a-z][a-z])/(.*) /$2?ln=$1 [L]

注意,您不需要hash(#)部分,这是一个仅用于客户端的URI功能,永远不会发送到服务器。一小时内两个Hero。既然你的两个答案都是正确的,为什么我不能在两个名字上都加V呢!我指定了这个问题,唯一的例外是zh CN,是否可以有一个特定的规则来处理该zh CN并使其成为/CN/所有其他都是两个小写字母。请注意,您不会在脚本中收到该URL的#7组件。哈希后的URI部分是仅客户端元素,不会传递到服务器端。我的上帝,你的英雄!工作正常,只是图像不会加载(它们是用php imgcpu?src=aster\u pfl/ad\u aquahome\u advision.jpg&w=234&h=160&c=f&f=bw生成的),我无法真正解读您的评论,但我猜您在处理图像时遇到了问题,因为它们使用了相对URL。这次重写使用了一个内部链接(到服务器)重定向,因此浏览器只知道“漂亮”URL。这很好,因为用户只看到漂亮的URL,但也意味着相对URL是相对于漂亮URL解析的。例如:
src=“images/baz.jpg”
将导致浏览器查找
/de/somepage/images/baz.jpg
。您可以在上述重写之前添加额外的重写以捕获这些情况,使图像URL“相对较少”(例如:
src=“/images/baz.jpg”--请注意前面的斜杠,或者使用HTML
`标记告诉浏览器它应该解析相对链接的URL。神圣的奶牛,为了减少相对性并从一开始就开始,这个单条/,似乎工作得很好!非常感谢Laurence!@Sam:BTW:我修改了规则,以处理语言“subtags”(即“CN”中的“CN”)“zh CN”是。顺便说一句,你可能不想把它折成“CN”,因为它可能有歧义。还有其他一些语言标签有子标签。例如:“zh TW”(繁体中文)、“en US”(美式英语)、“fr CA”(加拿大法语)。
RewriteRule ^zh-CN/(.*) /$1?ln=zh-CN [L]
RewriteRule ^cn/(.*) /$1?ln=zh-CN [L]
RewriteRule ^([a-z][a-z])/(.*) /$2?ln=$1 [L]