繁体   English   中英

如何通过未知数量的预设参数通过.htaccess解析URL查询

[英]How do I parse URL query via .htaccess with unknown number of preset parameters

我需要有关Apache的mod_rewrite规则的帮助。

我从PHP和.htaccess开始。 我一直在尝试获取用户的查询URL字符串,将“语言”和“页面”解析为GET变量,将它们传递到root用户的index.php文件中,并使用已编译的网页响应用户。 当未设置用户URL中的一个或两个参数时,我还需要脚本正确理解默认语言(ee)和页面(index)值。 例子:

1) "example.com/"           -->  "example.com/index.php?page=index&lang=ee"
2) "example.com/se/samples" -->  "example.com/index.php?page=samples&lang=se"
3) "example.com/se/"        -->  "example.com/index.php?page=index&lang=se"
4) "example.com/contact"    -->  "example.com/index.php?page=contact&lang=ee"
5) "example.com/ru/contact" -->  "example.com/index.php?page=contact&lang=ru"

我需要Apache始终仅显示“清除URL”,例如: example.com/se/samples 带有GET查询的“丑陋的URL”仅出于技术原因,对用户和/或搜索引擎可见。 我还担心安全性问题,因此我很乐意在.htaccess和/或index.php使用手动设置允许参数的白名单。


我在服务器端具有以下网站文件结构:

www:
|   .htaccess
|   __php__.php
|   index.php            <-- controller
|
+---css [...]
|
+---img [...]
|
+---js  [...]
|
+---lang                 <-- arrays of languages
|       lang_ee.json
|       lang_en.json
|       lang_ru.json
|       lang_se.json
|       sliders.json
|
\---tmpl                 <-- layout templates of pages
        contact.php
        footer.php
        header.php
        index.php
        nav.php
        retail.php
        samples.php
        services.php

我需要在前端使用以下站点地图结构:

lang=ee     page=index      example.com/
lang=ee     page=services   example.com/services
lang=ee     page=retail     example.com/retail
lang=ee     page=samples    example.com/samples
lang=ee     page=contact    example.com/contact

lang=en     page=index      example.com/en/
lang=en     page=services   example.com/en/services
lang=en     page=retail     example.com/en/retail
lang=en     page=samples    example.com/en/samples
lang=en     page=contact    example.com/en/contact

lang=ru     page=index      example.com/ru/
lang=ru     page=services   example.com/ru/services
lang=ru     page=retail     example.com/ru/retail
lang=ru     page=samples    example.com/ru/samples
lang=ru     page=contact    example.com/ru/contact

lang=se     page=index      example.com/se/
lang=se     page=services   example.com/se/services
lang=se     page=retail     example.com/se/retail
lang=se     page=samples    example.com/se/samples
lang=se     page=contact    example.com/se/contact

我目前的index.php

<?php

      if (isset($_GET['page'])) {
        $page=$_GET['page'];
      } else {
        $page='index';
      }

      if (isset($_GET['lang'])) {
        $lang=$_GET['lang'];
      }
      else { $lang='ee'; }


      // Include configs
      include('__php__.php');

      // Assign template
      include (ROOT_DIR.'tmpl/'.$page.'.php');

?>

我当前的.htaccess包括几次不幸的尝试:

# URLs rewrite
Options +FollowSymLinks  
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

#RewriteRule ^(services|retail|samples|contact)/?$ $1.php [L]
#RewriteRule ^(index|services|retail|samples|contact)$ index.php?page=$1&lang=ee [L]
#RewriteRule ^([^/].*)([^/].*)$ index.php?page=$2&lang=$1 [L]
#RewriteRule ^(en|ru|se)/(index|services|retail|samples|contact)$ index.php?page=$2&lang=$1 [L]
#RewriteRule ^([^(en|ru|se)].*)/$ index.php?page=$1&lang=ee [N]
#RewriteRule ^(.*)/(.*)$ index.php?page=$2&lang=$1 [L]
#RewriteRule ^(en|ru|se)/(services|retail|samples|contact)/?$ $1/$2.php [L]
#FFFFFUUU..

我设法使其与一个或两个参数集一起工作(例如example.com/se/example.com/se/contact ),但是我不知道进一步挖掘使脚本通用的想法。 请原谅我生锈的英语。

编辑我只需要我的脚本就可以“听”以下语言: en / ru / seee如果未设置); 和页面: servicesretailsamplescontactindex如果未设置)。 我仍然需要example.com/blabla上的404页面。 这就是我在问题标题中使用“预设参数”的意思。

这可能起作用:

RewriteEngine on
RewriteRule ^([A-Za-z]{2}+)/?$ /index.php?page=index&lang=$1 [R=301,NC,L]
RewriteRule ^([A-Za-z]{2}+)/(.*)$ /index.php?page=$2&lang=$1 [R=301,NC,L]
RewriteRule ^$ /index.php?page=index&lang=ee [R=301,NC,L]
RewriteRule ^((?!index.php).*)$ /index.php?page=$1&lang=ee [R=301,NC,L]

编辑:

RewriteRule ^$ /index.php?page=index&lang=ee [NC,L]
RewriteRule ^(services|retail|samples|contact)/?$ /index.php?page=$1&lang=ee [NC,L]
RewriteRule ^(en|ru|se)/?$ /index.php?page=index&lang=$1 [NC,L]
RewriteRule ^(en|ru|se)/(services|retail|samples|contact)?$ /index.php?page=$2&lang=$1 [NC,L]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM