search.php页

时间:2016-05-16 05:17:21

标签: php apache .htaccess mod-rewrite

我正在为search.php页面寻找正确的htaccess规则。因为我试过几次,但没什么用。我现有的htaccess规则可能会与之冲突。所以我也在这里粘贴我当前的htaccess文件。目前,我有以下搜索页面网址,其中包含查询字符串:

http://my-domain.com/search.php?q=keyword

我想要以下干净的网址:

http://my-domain.com/search/keyword

我的HTML表单是:

<form method="get" action="search.php">
    <input type="text" name="q" class="txtfield" value="<?php echo $q; ?>" placeholder="Search post here..." />
</form>

htaccess的:

Options +FollowSymlinks -MultiViews

RewriteBase /

#Enable mod rewrite
RewriteEngine On

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/([^/]+)$ page.php?category=$1&post=$2 [QSA,L]

请注意,我在上面的文件中没有与搜索相关的htaccess规则,因为我说没有任何效果。我总是看到404页面。这就是我删除它的原因。

此外,如果我在某个未来将表单中的提交按钮放在下面:

<form method="get" action="search.php">
    <input type="text" name="q" class="txtfield" value="<?php echo $q; ?>" placeholder="Search post here..." />
    <input type="submit" name="btnsearch" class="btn" value="Search" />
</form>

我的搜索网址将更改为:

http://my-domain.com/search.php?q=keyword&btnsearch=Search

然后我想知道在正确的htaccess规则中我将要做什么更正/修改,你将根据我的第一个查询给我?如果搜索网址包含两个或两个以上的查询字符串,我们应该有两个规则吗?请帮帮我这个家伙。感谢。

2 个答案:

答案 0 :(得分:2)

提交表单时,确实会将您的网址设为:

http://my-domain.com/search.php?q=keyword&btnsearch=Search

要保持提交的网址漂亮,您需要阻止使用Javascript代码提交表单,并使网址与此类似。

<html><head>
<script>
function prettySubmit(form, evt) {
   evt.preventDefault();
   window.location = form.action + '/' + form.q.value.replace(/ /g, '+');
   return false;
}    
</script>
</head><body>
<form method="get" action="search" onsubmit='return prettySubmit(this, event);'>
   <input type="text" name="q" value="<?php if (isset($_GET['q'])) echo $_GET['q']; ?>"
       class="txtfield" placeholder="Search post here..." />
   <input type="submit" name="btnsearch" class="btn" value="Search" />
</form>
</body></html>

这会将您的表单提交到漂亮网址

http://my-domain.com/search/keyword

现在,您需要在根.htaccess中使用此规则来处理这个漂亮的URL;

Options -MultiViews
RewriteEngine On

RewriteRule ^search/(.+)$ search.php?q=$1 [L,QSA,NC]

<强>更新

这是一种在不使用任何JS的情况下完全使用mod_rewrite规则的方法。在root .htaccess中使用以下规则:

Options -MultiViews
RewriteEngine On
RewriteBase /my-project/

# external redirect from actual URL to pretty one
RewriteCond %{THE_REQUEST} /search(?:\.php)?\?q=([^\s&]+) [NC]
RewriteRule ^ search/%1? [R=302,L,NE]

# internal forward from pretty URL to actual one         
RewriteRule ^search/(.+)$ search.php?q=$1 [L,QSA,NC]

答案 1 :(得分:1)

1.删除.php扩展名(可选)

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]

2.Support http://my-domain.com/find/keyword

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^find/([^/\.]+)$ /search.php?keyword=$1

3.测试

<?php
if ($_POST['query'] != '') {
   header( 'Location: /find/' . $_POST['query']);
}
echo $_GET['keyword'];
?>
<form method="post" action="">
   <fieldset>
      <input type="text" name="query" />
      <input type="submit" value="Search" />
   </fieldset>
</form>

希望这有帮助。