当我的客户端向网站添加页面时,新的页面名称应附加到RewiteRule正则表达式。因此,使用例如fwrite(),我希望PHP使用从数据库中收回的值来更改RewiteRule正则表达式。如果可以做到这一点,那么这个过程中是否存在任何陷阱?
编辑:在PHP脚本中处理将是解决方案,如果没有更多的... 第一个域/ index.php?page = pagename被301重定向到“domain / pagename” 警告访客这个页面永久移动 - (这是旧的 URL的PUBLIC位置应该给出这个301)。然后请求 像“domain / pagename”(新的公共位置),将是 默默地,内部重写为domain / index.php?page = pagename where 验证发生,无效时给出404。只是 密钥,?page = pagename的“page”部分,是静态的,可以 已验证并将直接从.htaccess中提供404。现在, 像domain / index.php?page = crap这样的请求首先会很好地给出301 像有效的域/ index.php?page = pagename那样,只有当 到达index.php可以识别为废话。所以还有 需要从数据库中获取页面名称到.htaccess。
这是.htacces内容的示例,以提供此问题的一些背景知识:
ErrorDocument 404 http://localhost/testsite/404.php
RewriteEngine on
RewriteBase /testsite/
## block craprequests without extension like domain/crap > 404
# The requests domain/pagename that do not go to existing pages, will now be redirected with a 302 to index.php?page=pagename and only then give a 404 through the errorcheck in the code.
# This should be done here, with a RewriteCond regex with database content
RewriteCond %{REQUEST_URI} !404.php$
RewriteRule .* 404.php [R=404,L]
## block-direct-queries ##
RewriteCond %{QUERY_STRING} !marker=1$
RewriteCond %{QUERY_STRING} page=(.*)
RewriteRule ^.*$ %1? [R=301,L]
## strip-extensions ##
RewriteCond %{QUERY_STRING} !.
RewriteCond %{REQUEST_URI} !404.php$
RewriteRule ^([\w+%*\d*\+*\-*]+)\.(php[\s]{0,3}|htm[\s]{0,3}|html[\s]{0,3})$ $1 [R=301,L]
## put-querystring
RewriteRule ^([\w\-_]+)\/?$ index.php?page=$1&marker=1 [L]
答案 0 :(得分:2)
很抱歉继续向您重复此操作,但不需要在.htaccess中存储页面名称。这可以在PHP中更简单地完成。
您需要的唯一重写规则是:
RewriteCond %{REQUEST_URI} !^/?index\.php$
RewriteRule .* /index.php [L,QSA]
现在,在PHP中,您可以执行以下操作:
// The important point here is that $_SERVER['REQUEST_URI'] contains the actual
// path the user typed into their browser, which is what you are interested in
if (strtolower(basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) === 'index.php') {
// The user directly requested index.php
if (!empty($_GET['page']) || value_of_page_is_crap()) {
// The user requested a bad page
header("{$_SERVER['SERVER_PROTOCOL']} 404 Not Found");
} else {
// Redirect to correct URL
header("{$_SERVER['SERVER_PROTOCOL']} 301 Moved Permanently");
header("Location: http://{$_SERVER['HTTP_HOST']}/{$_GET['page']}");
}
exit;
}
// The request is allowed to continue
$requestedPage = pathinfo($_SERVER['REQUEST_URI'], PATHINFO_FILENAME);
.htaccess将通过PHP盲目地路由每个请求,其中可以使用比mod_rewrite笨重的基于PCRE的规则更精确的逻辑。
PHP脚本检查用户在浏览器中输入地址栏的URI。如果他们直接请求index.php
,它将检查$_GET['page']
是否包含合理的值,如果是,则将其重定向到正确的URL,如果没有响应404.如果用户没有请求索引。 php直接,脚本可以继续。我添加了一个示例行,以显示您如何提取他们请求的页面的值,但是您从这里开始的方式取决于您。
答案 1 :(得分:1)
这很有可能(虽然写入权限可能是个问题)。但是,它不是通过index.php文件从客户端路由所有请求并让PHP处理路由的更好方法。
通过这种方式,您将获得最大的灵活性,而且您不必做“hacky”的事情。
修改强>
所有形式的重定向都可以通过PHP完成。例如。 301
重定向的示例:
header ('HTTP/1.1 301 Moved Permanently');
header ('Location: http://example.com/new/path'); // note the full address
exit();
有关header()
。