如何使用.htaccess创建用户友好的URL?

时间:2016-10-20 06:16:12

标签: php .htaccess

以下是包含选项值的选择标记的html表单:

<select class="form-control" id="basic" name="location" required>
<?php
$get_location = mysqli_query($conn, "SELECT * FROM product_sub_area");
if(mysqli_num_rows($get_location) == 0 ) {
    $choose = 'No City found';
} else {
    $choose = 'Choose City';
}
?>
<option value=""><?php echo $choose; ?></option>
<?php                                         
while($get_location_result = mysqli_fetch_array($get_location) ) {
    $location_id = (int) $get_location_result['psub_area_id'];
    $location_name = htmlspecialchars($get_location_result['psub_name']);
    echo "<option value='$location_name'>$location_name</option>";
}
?>                    
</select>

提交此表单后,页面网址显示如下:

  

http://localhost/freelancer/sitename/location?location=California

我希望网址对于每种相同类型的网址请求都应该是这样的。它可以是多个查询字符串:

  

http://localhost/freelancer/sitename/location/California

我正在使用以下.httaccess规则:

ErrorDocument 404 /not-found.php
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [NC,L]
RewriteRule ^([^/\.]+)/([^/\.]+)$ location.php?location=$1 [NC,L]  

2 个答案:

答案 0 :(得分:1)

在sitename文件夹中尝试这个,我从你的要求中观察到你正在删除php扩展并重写请求到location参数。

ErrorDocument 404 not-found.php
RewriteEngine On        

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

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

答案 1 :(得分:0)

在这种情况下,您必须使用JavaScript来触发提交,然后改变提交的URL以仅包含州名称。您可以为此use jQuery或标准JS。这两个解决方案非常相似,所以你可以很容易地将jQuery重新编写为vanilla。

您必须使用JS的原因是因为这一切都发生在您将请求发送到服务器之前,而这正是您要更改的请求。

PS:请记住为非JS启用的浏览器添加回退(是的,它们确实存在)和网络爬虫。