如果某个内容跟随目录,则重定向,但目录本身不重定向

时间:2018-12-11 03:38:34

标签: regex apache .htaccess

我想重定向URI后面的内容,但是我一直遇到麻烦。

基本上,我想将/from/here/1234重定向到/to/there.php?id=1234。但是,只有当URI在我的模式的 之后格式化为/form/here/1234/edit时,我才能使其正常工作。

这是“有效”规则:

RewriteEngine on

RewriteCond "%{REQUEST_URI}" !-d
RewriteRule ^from/here/(.*)/edit/?$ /to/there.php?id=$1

无论有没有RewriteCond,我都尝试过,但进行了以下更改:

  • 如果我删除/edit,则规则为

    RewriteRule ^from/here/(.*)/?$ /to/there.php?id=$1`
    

    我收到“内部服务器错误”,并且“此外,尝试使用ErrorDocument来处理请求时,遇到500内部服务器错误错误。”

    我无法使用此规则访问/from/here/from/here/

  • 如果我添加一个斜杠,请删除/edit?,以使规则为

    RewriteRule ^/from/here/(.*)/$ /to/there.php?id=$1
    

    我可以使用此规则访问/from/here/from/here/,但不能访问/from/here/1234(404)。

    我创建了一个测试404页面,仅用于打印$_SERVER变量,而REQUEST_URI看起来并不奇怪(即显示为/from/here/1234)。

  • 如果我删除了/edit?,则规则是

    RewriteRule ^from/here/(.*)/$ /to/there.php?id=$1
    

    仅当出现斜杠时才有效,除非我添加规则

    RewriteRule ^from/here/([a-z0-9\-]+)$ /from/here/$1/ [NC]
    

    虽然可行,但感觉不到正确 ...

在这里,我必须缺少一些简单/基本的东西,因为我一直在努力寻找对自己没有帮助的东西(这几乎总是意味着我已经无脑地错过了“值得一提的东西”) 。我对.htaccess文件的编辑不是很熟悉,所以没有帮助。

TL; DR -我想重定向斜线后的内容,但前提是确实有斜线后的内容。转发/from/here/1234,但不转发/from/here/from/here/

2 个答案:

答案 0 :(得分:0)

我知道……正则表达式太包容了。将规则更改为

RewriteRule ^from/here/([a-z0-9\-]+)/?$ /to/here.php?id=$1 [NC]

一切都很好。

答案 1 :(得分:0)

最简单的修改是将.*更改为.+,以便在/from/here/之后必须有任何东西。

RewriteRule ^/from/here/(.+)$ /to/there.php?id=$1

如果您不希望在$1中包含斜杠,则可以通过添加问号使.+变得非贪婪。将其设置为非贪婪将确保/?捕获任何尾随的斜杠,而不是.+这样做。

RewriteRule ^/from/here/(.+?)/?$ /to/there.php?id=$1