我正在尝试做什么: 拥有格式为“http://domain.tld/one/two/three”的漂亮网址,通过查看REQUEST_URI服务器变量,由PHP脚本(index.php)处理。 在我的例子中,REQUEST_URI将是'/ one / two / 3'。 (顺便说一下,这是一个好主意吗?)
我正在使用Apache的mod_rewrite来实现这一目标 这是我在.htaccess中使用的RewriteRule:
RewriteRule ^/?([a-zA-Z/]+)/?$ /index.php [NC,L]
到目前为止,这项工作非常顺利;它将每个由a-z,A-Z或'/'组成的REQUEST_URI转发到/index.php,并在其中进行处理。
唯一的缺点:'?' (问号)和'#'(哈希键)似乎仍然可以在REQUEST_URI中使用,也许还有更多我尚未找到的字符。
是否可以通过我的.htaccess和RewriteRule添加足够的内容来限制它们?
谢谢!
答案 0 :(得分:1)
片段标识符,例如#some-anchor,由浏览器控制,而不是服务器。需要JavaScript才能重定向并删除它,不过为什么你会这样做我不确定。
[澄清后的SNIPPED] 仅在查询字符串为空时重写:
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^/?([a-zA-Z/]+)/?$ /index.php [NC,L]
答案 1 :(得分:1)
在mod_rewrite和PHP中,变量 REQUEST_URI 指的是两个different part of the URI。在mod_rewrite中,%{REQUEST_URI}
包含当前的 URI路径;在PHP中,$_SERVER['REQUEST_URI']
包含 URI路径和查询。但在这两种情况下,URI片段作为URI的这一部分不会传输到服务器,而只会被客户端使用。
因此,当请求/one/two/three?foo#bar
时,mod_rewrite的%{REQUEST_URI}
包含/one/two/three
,而PHP的$_SERVER['REQUEST_URI']
包含/one/two/three?foo
。
答案 2 :(得分:0)
在执行重写之前,$_SERVER['REQUEST_URI']
变量将包含服务器收到的原始REQUEST_URI。因此,从REQUEST_URI的属性中删除查询字符串部分是不可能的(我早知道这一点),但是当你在脚本中处理$_SERVER['REQUEST_URI']
变量时,你自然可以选择删除它。 / p>
如果您只想在未指定查询字符串时执行RewriteRule,则以下内容应该有效:
RewriteCond %{QUERY_STRING} !^.+$
RewriteRule ^/?([a-zA-Z/]+)/?$ /index.php [NC,L]
请注意,这可能会有问题,因为如果网站中有人用来链接到您的网站时出现意外的查询字符串,那么您的脚本就不会处理它(因为重写永远不会发生),所以他们会获得404响应(或者不管是什么情况)可能不像用户友好地忽略尾随信息那样用户友好。
答案 3 :(得分:0)
如果我明白,你想禁止使用?和#为您的网站?
你不应该这样做,因为:
因此,如果您强制Apache拒绝包含问号的网址请求,那么在AdWords中点击您的广告的用户只能看到404错误页面。
让人们同时使用它们并没有什么不好。这种情况是为了防止您的网站遭受XSS攻击。
顺便说一下。还有另一个非常重要的标志 - 用于编码特殊字符的百分比(%)(如波兰语或德语国家字母)