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