htaccess重写从文件请求中删除文件夹

时间:2017-05-03 02:37:42

标签: .htaccess mod-rewrite

开发多语种网站。该语言存储为会话变量,每种语言的内容都加载到同一页面 - 实际上是英语内容的不同翻译。但是,我需要为每种语言使用不同的URL。

语言将始终是URI开头的2个字符文件夹,但英语将没有文件夹。例如:

www.mydomain.com/product/detail [English]
www.mydomain.com/fr/product/detail [French]
www.mydomain.com/de/product/detail [German]
www.mydomain.com/ja/product/detail [Japanese]

所有这些网址都会在以下位置获取相同的文件:

www.mydomain.com/product-detail.php

以下是我目前的htaccess规则:

# ==== REWRITE URLS ====
RewriteEngine On

# Permanently redirect "foo.php" to "/foo"#
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NE,L,R=301]

# pass through root
RewriteRule ^(index\.php|Sitemap\.xml)?$ - [L]

# no more / so add extension
RewriteCond $1 !/
RewriteCond $1 !\.php$
RewriteCond ${REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /$1.php [L]

RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag
RewriteRule ^(.*)/(.*)$ /$1-$2 [L]

# === end rewrite URLs ===

所以我需要一个额外的重写规则,即如果长度为2个字符并且匹配FR | DE | JA,则忽略第一个文件夹,但也可以使用现有规则。

任何帮助都会非常感激,因为htaccess不是我的力量......

1 个答案:

答案 0 :(得分:1)

你的规则可以进行大修,因为他们在某些地方有点含糊不清,不一致和啰嗦。除此之外,由于它清楚地表明它们无论如何都在工作[1],将最后一条规则改为这样看起来应该像你要求的那样:

RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L]

它仅适用于小写语言代码,如示例中所示。如果您需要,可以通过将末尾方括号中的标记更改为[L,NC]来更改它以支持任何情况。

1 - 暗示以后进行更改无法按预期工作,或某些事情可能无法按预期工作

<强>更新

要同时使用/product等网址,请尝试在最后添加:

RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(?:(?:fr|de|ja)/)(.*)$ /$1 [L]

更新2

所以最后看起来应该是这样的:

RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L]

RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(?:(?:fr|de|ja)/)(.*)$ /$1 [L]

更新3

改变计划,抱歉,但只是意识到这不会起作用。试试这个,替换倒数第二部分:

# no more / so add extension
RewriteCond $1 !/
RewriteCond $1 !\.php$
RewriteCond ${REQUEST_FILENAME} !-f
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)$ /$1.php [L]

最后一节应该回到:

RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L]

而且重申一下,我根本不喜欢这个,它不是一个优雅的解决方案,但它应该起作用,并且是它已经设置的自然进展。真的,这一切都需要重写。

这里的全部事情要明确:

# ==== REWRITE URLS ====
RewriteEngine On

# Permanently redirect "foo.php" to "/foo"#
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NE,L,R=301]

# pass through root
RewriteRule ^(index\.php|Sitemap\.xml)?$ - [L]

# no more / so add extension
RewriteCond $1 !/
RewriteCond $1 !\.php$
RewriteCond ${REQUEST_FILENAME} !-f
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)$ /$1.php [L]

RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L]

# === end rewrite URLs ===