我是使用.htaccess文件的新手,所以我遇到了一些错误:
具体来说,我的mod_rewrite尝试有三个问题。
我需要它能够解析有限的域名,例如mydomain.com/user
,并将其作为mydomain.com/elements/scripts/view/?pth=user
和mydomain.com/user/register-new
吐出为mydomain.com/elements/scripts/view/?pth=user&ext=register-new
我目前有:
RewriteRule ^/([A-Za-z0-9]+)/(.*)$ /elements/scripts/view?pth=$1&ext=$2 [NC,L]
我不确定这是否有效,因为似乎没有触发L
标志,并且它会重写它,然后由于某种原因再次使用pth=elements&ext=scripts/view
重写它。 / p>
我遇到的另一个问题是我能够知道它是如何被重写的。我希望mod_rewrite对用户不可见(浏览器仍显示mydomain.com/user
),但它当前将浏览器URL更改为RewriteRule替换。
非常感谢任何帮助,谢谢!
答案 0 :(得分:0)
请尝试使用此选项:
RewriteRule ^user/?(([^/]+)/?)?$ /elements/scripts/view?pth=user&ext=$2 [QSA,NC,L]
您的规则是一种广泛的方式..它会重写为另一个非固定目标网址(不是/index.php
或类似的东西 - 我无法判断/elements/scripts/view
是否是真实文件......或其他“虚拟”路径。
由于您需要只使用/user
路径的网址,因此我已将其硬编码为规则 - 这会使规则更具体。
此规则需要放在网站根文件夹中的 .htaccess 中。对于任何其他位置,它需要一些小的修改。
将规则放在适当的位置 - 规则的顺序很重要。
“我不确定这是否有效,因为似乎没有触发L
标志,它会重写它,然后再次使用pth=elements&ext=scripts/view
重写它某种原因。“
在Apache看到[L]
标志后,它会停止进一步重写(当然,如果规则匹配)并转到下一次迭代开始从开始检查所有规则 - 这是它的工作方式和很多人似乎都没有意识到这一点。
您可能有一些其他规则可能会产生此类行为。但很可能它是由您当前的规则完成的 - 您拥有的模式(正则表达式)非常广泛,可以捕获已经重写的URL(/elements/scripts/view
)并再次重写(模式将匹配)。
<强>更新 根据您提供的其他信息,可以使用这些规则(1条规则匹配所有规则):
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# Do not do anything for already existing files
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .+ - [L]
RewriteRule ^([a-z0-9]+)(/?(.*))$ /elements/scripts/view/index.php?pth=$1&ext=$3 [QSA,NC,L]
这些规则不会重写对现有文件的请求(例如css / jpg / js文件)。
当对此类网址mydomain.com/user/register-new
发出请求时,会将其重写为
/elements/scripts/view/index.php?pth=user&ext=register-new
并重写进入下一次迭代。在下一次迭代中,规则#1将告诉Apache停止重写..因为/elements/scripts/view/index.php
文件确实存在。完成工作。
如果由于某些原因上述情况不佳(例如,您仍需要重写对物理现有文件的请求并动态提供它们),请改用:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/elements/scripts/view/index.php [NC]
RewriteRule ^([a-z0-9]+)(/?(.*))$ /elements/scripts/view/index.php?pth=$1&ext=$3 [QSA,NC,L]
RewriteCond
告诉Apache如果已经指向/elements/scripts/view/index.php
,则不要重写URL。如果匹配模式,则可以重写任何其他URL。
请记住,因为我不知道您可能拥有的所有可能的网址(您的网址结构),所以 模式可能需要进行一些调整。