使用可选参数重写 url 并避免混淆
rewrite urls with optional parameters and avoid confusion
假设我有这 5 个 url(带有参数)并且想为每个创建 url 重写。
这些 URL 是搜索表单的可能结果。
(按表格搜索是使用 3 个可选的过滤器完成的:专业、地区、城市)
search.php?speciality=cardiologist®ion=my_region&city=my_city
doctor/cardiologist/my_region/my_city
search.php?speciality=cardiologist®ion=my_region
doctor/cardiologist/my_region
search.php?speciality=cardiologist
doctor/cardiologist
search.php?region=my_region&city=my_city
doctor/my_region/my_city
search.php?region=my_region
doctor/my_region
我怎样才能使用 htaccess/regex 重写规则来管理这些 url 并避免混淆
我试过了,但我认为它会造成混淆,所以效果不佳(我是正则表达式的初学者)
RewriteRule ^doctor/([a-zA-Z\-]+) search.php?speciality= [L]
RewriteRule ^doctor/([a-zA-Z\-]+) search.php?region= [L]
RewriteRule ^doctor/([a-zA-Z\-]+)/([a-zA-Z\-]+) search.php?speciality=®ion= [L]
RewriteRule ^doctor/([a-zA-Z\-]+)/([a-zA-Z\-]+) search.php?region=&city= [L]
RewriteRule ^doctor/([a-zA-Z\-]+)/([a-zA-Z\-]+)/([a-zA-Z\-]+) search.php?speciality=®ion=&city= [L]
您推荐什么解决方案?
search.php?speciality=cardiologist®ion=my_region&city=my_city
doctor/cardiologist/my_region/my_city
如果 speciality
、region
和 city
都是独立可选且完全可变的,则无法在 .htaccess
/mod_rewrite 中解决此歧义。
查询字符串通过包含参数名称解决了这种歧义。如果您删除识别“名称”(就像您在 URL-path 中所做的那样),它就完全不明确了。
从人类可读的角度来看,你怎么知道下面的URL代表什么?
doctor/foo/bar
doctor/baz/qux
如果 speciality
、region
和 city
的所有值在您的应用程序中都是唯一的,那么您可以通过查找数据库中的值来确定哪个值是 speciality
、region
或 city
。但这会给您的应用程序带来很大的开销,因为您必须执行几个额外的数据库查找。如果它们不是唯一的(现在或将来),那么这个问题就无法解决。
您需要在 URL-path 中使用 something 来标识每个值:speciality
、region
或 city
。例如:
doctor/s-cardiologist/r-my_region/c-my_city
doctor/r-my_region/c-my_city
doctor/s/my_speciality/r/my_region/c/my_city
doctor/r/my_region/c/my_city
或者在值不可用时使用占位符:
doctor/my-speciality/my-region/my-city
doctor/none/my-region/my-city
doctor/none/none/my-city
尽管这些解决方案是否比原始查询字符串更好?
假设我有这 5 个 url(带有参数)并且想为每个创建 url 重写。 这些 URL 是搜索表单的可能结果。 (按表格搜索是使用 3 个可选的过滤器完成的:专业、地区、城市)
search.php?speciality=cardiologist®ion=my_region&city=my_city
doctor/cardiologist/my_region/my_city
search.php?speciality=cardiologist®ion=my_region
doctor/cardiologist/my_region
search.php?speciality=cardiologist
doctor/cardiologist
search.php?region=my_region&city=my_city
doctor/my_region/my_city
search.php?region=my_region
doctor/my_region
我怎样才能使用 htaccess/regex 重写规则来管理这些 url 并避免混淆
我试过了,但我认为它会造成混淆,所以效果不佳(我是正则表达式的初学者)
RewriteRule ^doctor/([a-zA-Z\-]+) search.php?speciality= [L]
RewriteRule ^doctor/([a-zA-Z\-]+) search.php?region= [L]
RewriteRule ^doctor/([a-zA-Z\-]+)/([a-zA-Z\-]+) search.php?speciality=®ion= [L]
RewriteRule ^doctor/([a-zA-Z\-]+)/([a-zA-Z\-]+) search.php?region=&city= [L]
RewriteRule ^doctor/([a-zA-Z\-]+)/([a-zA-Z\-]+)/([a-zA-Z\-]+) search.php?speciality=®ion=&city= [L]
您推荐什么解决方案?
search.php?speciality=cardiologist®ion=my_region&city=my_city doctor/cardiologist/my_region/my_city
如果 speciality
、region
和 city
都是独立可选且完全可变的,则无法在 .htaccess
/mod_rewrite 中解决此歧义。
查询字符串通过包含参数名称解决了这种歧义。如果您删除识别“名称”(就像您在 URL-path 中所做的那样),它就完全不明确了。
从人类可读的角度来看,你怎么知道下面的URL代表什么?
doctor/foo/bar
doctor/baz/qux
如果 speciality
、region
和 city
的所有值在您的应用程序中都是唯一的,那么您可以通过查找数据库中的值来确定哪个值是 speciality
、region
或 city
。但这会给您的应用程序带来很大的开销,因为您必须执行几个额外的数据库查找。如果它们不是唯一的(现在或将来),那么这个问题就无法解决。
您需要在 URL-path 中使用 something 来标识每个值:speciality
、region
或 city
。例如:
doctor/s-cardiologist/r-my_region/c-my_city
doctor/r-my_region/c-my_city
doctor/s/my_speciality/r/my_region/c/my_city
doctor/r/my_region/c/my_city
或者在值不可用时使用占位符:
doctor/my-speciality/my-region/my-city
doctor/none/my-region/my-city
doctor/none/none/my-city
尽管这些解决方案是否比原始查询字符串更好?