删除url .php扩展名和get请求的参数?

时间:2018-09-18 09:14:29

标签: php apache .htaccess

我的网址是:

@app.route('/')
def index():
    if not session.get('logged_in'):
        return return redirect(url_for('login'))
    else:
        return render_template('index.html')  

@app.route('/login', methods=['POST','GET'])
def login():
    if request.method = "POST":
        tok = request.form['token']

        if (check_token(tok) == "pass"):  
            session['logged_in'] = True
        return redirect(url_for('index'))

        else:
            flash("wrong token")

    return render_template("login.html")

我需要这样:

https://example.com/detail.php?id=56&subcat=11

使用.htaccess文件,我无法删除参数名称(id,subcat)和问号(?)。我只删除了.PHP扩展名。

https://example.com/detail/56/11

谢谢。

3 个答案:

答案 0 :(得分:0)

这是一个有点复杂的问题。您不会仅通过.htaccess达到目标。您必须解析从url到数组的变量,并使其可以从php代码访问。在this link的“使用php”部分中,有一些执行此操作的示例。

由于您不想使用“普通”链接,因此我们必须处理页面请求并手动解析它们。首先在您的htaccess重定向中定义:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?path=$1 [NC,L,QSA]

然后创建index.php来处理重定向。

// your available sites
$sites = [ 'detail' ];

$path = $_GET['path'];
$params = explode( "/", $path );
$site = array_shift($params);

if( in_array( $site, $sites ) ){
    include($site.".php");
}

现在,在detail.php中,您可以使用$params,并获得带有值的数组。因此我们的http://example.com/detail/56/1就像http://example.com/index.php?path=detail/56/1。通过此方法,我们将在details.php中编写逻辑,然后可以使用$params,它等于Array ( [0] => 56 [1] => 1 )

如果将链接更改为/detail/id/56/subcat/11,则链接的代码可读性更高。只需在签入in_array之前添加它

$x = [];
for( $i=0; $i<count($params); $i+=2 )
    $x[$params[$i]] = $params[$i+1];
$params = $x;

这只是想法的简单示例。最好在路由中使用一些框架,例如交响乐。

答案 1 :(得分:0)

只需将以下内容放入您的.htaccess文件中(并确保启用了mod_rewrite):

RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]
RewriteRule ^index.php/([^/]+)/?([^/]*) /index.php?id=$1&subcat=$2 [NC]

答案 2 :(得分:0)

您可以使用以下.htaccess示例文件 注意:用您的php文件名替换filename1和filename2

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(filename1.*)$ filename1.php?path=$1 [NC,L,QSA]
RewriteRule ^(filename2.*)$ filename2.php?path=$1 [NC,L,QSA]