.htaccess 如何在htaccess/mod_write中更正重写规则

3phpmpom  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(106)

我想重写以下URL:

/app/12345 => /app/vv_start.php?id=12345
/app/12345/login => /app/vv_login.php?id=12345
/app/12345/settings => /app/vv_settings.php?id=12345

我到目前为止:

RewriteRule ^app/([^/]+)/login/?$                   app/vv_login.php?id=$1 [L,NC,QSA]
RewriteRule ^app/([^/]+)/settings/?$                app/vv_settings.php?id=$1 [L,NC,QSA]
RewriteRule ^app/([^/]+)/?$                         app/vv_start.php?id=$1 [L,NC,QSA]

最后一个规则会导致问题,因为它似乎一直都适用。删除最后一个规则时,前两个规则会正常运作,否则就无法正常运作。如何更正最后一个规则?
顺便问一下,这两个规则之间有什么区别吗?我应该使用哪一个(URL开头的斜线)?

RewriteRule ^app/([^/]+)/login/?$                   app/vv_login.php?id=$1 [L,NC,QSA]

RewriteRule ^app/([^/]+)/login/?$                   /app/vv_login.php?id=$1 [L,NC,QSA]
q7solyqu

q7solyqu1#

请尝试以下.htaccess规则文件请确保在测试URL之前清除浏览器缓存

RewriteEngine ON

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/]+)/login/?$   app/vv_login.php?id=$1 [L,NC,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/]+)/settings/?$    app/vv_settings.php?id=$1 [L,NC,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/([^/]+)/?$   app/vv_start.php?id=$1 [L,NC,QSA]

对于您在路径之前关于/的问题:是的,这是有区别的,因为/app意味着你有一个以它命名的挂载(就Linux/Unix而言),或者它是一个根/基位置。其中没有/意味着你的app可能存在如下:例如root/singh/htdocs等。所以是的,它们都有不同的含义和目的。

zphenhs4

zphenhs42#

看起来你的.php文件在app/子目录中。你可以在app/.htaccess中使用以下代码:

RewriteEngine On
RewriteBase /app/

# ignore rules for files and directories
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^([\w-]+)/(login|setting)/?$ vv_$2.php?id=$1 [L,NC,QSA]

RewriteRule ^([\w-]+)/?$ vv_start.php?id=$1 [L,NC,QSA]

你问:
顺便问一下,这两个规则之间有什么区别吗?我应该使用哪一个(在url开头的斜线)?
我建议不要在内部重写规则中使用前导/,因为重写处理程序目标相对于当前目录。它还有一个额外的优点,即在重写处理程序目标不存在的情况下防止重写循环。

相关问题