【问题标题】:Apache URL Rewrite to domain.com/custom_url_nameApache URL 重写为 domain.com/custom_url_name
【发布时间】:2011-04-15 22:44:38
【问题描述】:

在 Red Hat 服务器上使用 Apache,我正在尝试重写我们网站上会员商店的 URL:

domain.com/store.php?url=12345

到:

domain.com/12345

使用这些规则,如果我总是记得添加一个结束斜线,我可以让它工作:

Options -Indexes 
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^store/url/(.*)$ store.php?url=$1
RewriteRule ^(.*)/$ store.php?url=$1

domain.com/12345/ 有效, 但 domain.com/12345 不起作用。

删除 Rewrite 代码最后一行中的斜线会破坏很多内容。有没有办法让它在有或没有结尾斜杠的情况下都可以工作?

【问题讨论】:

  • 去掉斜线会破坏什么?

标签: apache .htaccess mod-rewrite


【解决方案1】:

如果你把斜线 optional 加了呢?此外,您可能需要指定比(.*) 更具体的内容,因为 domain.com/a/b/c/d/e 将匹配。相反,您可以使用否定的character class 来指定除斜线之外的所有内容。

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

或者,如果您只想捕获数字,您可以使用\d shorthand class(匹配任何数字)和+,它指定必须至少存在一个数字:

RewriteRule ^(\d+)/?$ store.php?url=$1

【讨论】:

  • 嗯。猜猜这已经变成了一个更复杂的正则表达式。我正在尝试任何单词字符,然后是可选的连字符和可选的附加单词字符。我认为模式是:[\w]+[-\w]+?
  • \w+(-\w+)* 可能是您正在寻找的(假设您不想要连续的破折号)。如果您在重写规则的另一个方面遇到更多问题,请随时提出另一个问题。
【解决方案2】:

您使用^(.*)$ 的尝试失败,因为这将匹配任何URL 路径。使用比.* 更具体的模式,也许\d+ 只允许一个或多个数字:

RewriteRule ^(\d+)$ store.php?url=$1

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 2013-12-07
    • 2013-02-02
    • 1970-01-01
    • 2012-01-07
    • 2011-12-19
    • 1970-01-01
    • 2010-10-30
    • 2012-02-20
    相关资源
    最近更新 更多