.htaccess-重写,第一个参数可选

.htaccess-重写,第一个参数可选,.htaccess,url-rewriting,.htaccess,Url Rewriting,我正在尝试为页面和语言制定重写规则。 有两种可能的选择: website.com/photos/photo1 => website.com?page=photos&menu=photo1 及 我有这个,但问题是当第一个参数是可选的 RewriteCond %{REQUEST_URI} ^/(en)/(.*) RewriteRule ^.* %2?lg=%1 [QSA,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQ

我正在尝试为页面和语言制定重写规则。 有两种可能的选择:

website.com/photos/photo1 => website.com?page=photos&menu=photo1

我有这个,但问题是当第一个参数是可选的

RewriteCond %{REQUEST_URI} ^/(en)/(.*)
RewriteRule ^.* %2?lg=%1 [QSA,L]

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

您可能不需要检查请求是否映射到物理文件的
RewriteCond
指令,因为
/photos/photo1
格式的请求(没有文件扩展名)不太可能映射到文件(前提是您的正则表达式具有足够的限制性)。当然,假设最后一个路径段中不允许使用点

除非您允许直接请求目录,否则您可能也不需要目录检查

与代码示例一样,您应该直接重写到处理请求的文件,即
index.php
。示例URL中省略了这一点。如果您在重写中省略了它,那么您依赖于mod_dir为目录索引发出内部子请求

对于语言代码,我将假定任意两个小写字母,即。
[a-z]{2}
。如果这只能是
en
或仅选择少数语言,则根据需要进行更改(例如
en | dk | jp
-使用交替)

整个第一个路径段(非捕获)是可选的,捕获子模式为
$1
反向引用(省略时为空)提供值

对于
页面
菜单
路径段,我使用了
\w
速记字符类(而不是像您的示例中的斜杠以外的任何字符)-这与
a-z
a-z
0-9
(下划线)匹配,因此这自然排除了点

我已经将尾部斜杠设置为可选的,就像在您的指令中一样,但是最好决定是否允许尾部斜杠。什么是标准URL


使用单个指令唯一可能的“警告”是,当没有提供lang path段时,您将得到一个空URL参数(但它始终存在)。例如,
index.php?lang=&page=photos&menu=photos1
。尽管在我看来,这可能更可取。

对于这种情况,最好使用第二块RewriteConds+规则。
RewriteCond %{REQUEST_URI} ^/(en)/(.*)
RewriteRule ^.* %2?lg=%1 [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)?/?$ index.php?page=$1&menu=$2 [L,QSA]
RewriteRule ^(?:([a-z]{2})/)?(\w+)/(\w+)/?$ index.php?lang=$1&page=$2&menu=$3 [QSA,L]