2016-05-16 70 views
2

我正在为我的search.php页面寻找正确的htaccess规则。因为我尝试了几次,但没有奏效。我现有的htaccess规则可能会与它冲突。所以我也在这里粘贴我当前的htaccess文件。目前,我有以下搜索网页网址查询字符串:htaccess for search.php的规则页面

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页面。这就是我删除它的原因。

而且如果我把表单提交按钮,在未来的某个象下面这样:

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

然后我想知道什么校正/修改我将:

<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> 

我的搜索URL将改变必须在正确的htaccess规则中执行,您将根据我的第一个查询向我提供哪些规则?如果搜索网址包含两个或两个以上的查询字符串,我们是否应该有两条规则?请帮助我这个家伙。谢谢。

回答

1

当表单提交它确实会让你的网址为:

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

要保留您所提交的网址很需要防止表单提交使用Javascript代码,使URL很喜欢这个。

<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> 

这将提交您的形式向漂亮的URL

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

现在你需要在你的根此规则。htaccess处理这个漂亮的URL;

Options -MultiViews 
RewriteEngine On 

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

更新:

这里是一个办法做到这一点完全使用mod_rewrite规则,而无需使用任何JS。在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] 
+0

好吧,但我不明白为什么每个人都建议使用JavaScript?为什么只能在PHP/htaccess中完成?如果有人在他的浏览器中关闭了JS,会发生什么?你能告诉我如何在没有JS的情况下做到这一点吗? – user5307298

+0

我想要一个解决方案,可以在两种情况下工作 - 一个没有提交按钮和提交按钮的表单。我需要两种情况下的htaccess规则。 – user5307298

+0

嗯..那么什么是[http://matthewjamestaylor.com/blog/how-to-post-forms-to-clean-rewritten-urls](http://matthewjamestaylor.com/blog/how-to-post -form-to-clean-rewritten-urls)for? – user5307298

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> 

希望这有助于。

+1

'find.php'如何进入图片? OP显示该文件是'search.php' ... –

+0

,因为'search/keyword'中的'search'名称不应该与文件名search.php相同,所以我给了它另一个名字。 – keziah

+1

这没有意义... –