htaccess重定向(非www到www,语言默认选择,正确的URL重写)

时间:2013-02-21 19:01:24

标签: .htaccess

我需要一些正确编写.htaccess文件的帮助。我确实尽我所能,但总是没有按预期工作。我想要实现的是:

  • 首先,如果浏览器请求favicon.ico,它会立即获得404,没有异常,没有重写/重定向(我的当前代码仍会重写它,然后返回404),
  • 如果子域名为admin.,请将流量重写为/admin/文件夹(在网址中保留admin.),否则重写为www.
  • 检查网址前面的网址是否为www.,即使是在任何“子文件夹”上(例如:domain.com/en/sub1/sub2/),否则重定向,
  • 检查语言是否被选中(en | sl),否则选择默认sl并重定向 对根目录中的index.php的其他请求(包括lang代码,例如:www.domain.com/en/example/#selection,?a = b不需要发送,我不会使用它)

当前.htaccess

Options +FollowSymlinks -Indexes
RewriteEngine on

// this works somewhat (still rewrites 2 times... I can see it in apache log)
RedirectMatch 404 favicon.ico
// this doesn't work at all
Redirect 404 /favicon.ico

RewriteCond %{HTTP_HOST} ^admin\. [NC]
RewriteRule ^(.*)$ /admin/$1 [L]

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# Check if lang. code is provided otherwise select sl
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/(sl|en)/ [NC]
RewriteRule ^(.*)$ /sl/$1 [R,L]

# Add trailing slash if not found
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R,L]

# Process virtual links/directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/?$1 [QSA,L]

问题:

  • 访问admin.domain.com时,我得到500 Internal Server Error
  • favicon.ico在第一个实例时不会返回404,
  • 其他一切都有效,但如果您有关于如何改进它的建议,我将不胜感激。

SOLUTION:

我删除了RedirectMatch规则并且只使用Redirect 404 /favicon.ico,但此外我必须添加几乎所有地方RewriteCond %{REQUEST_FILENAME} !favicon.ico以获得正确的404响应(没有任何重写/重定向)。< / p>

关于admin子域名:我留下完全相同的规则,但我在/ admin文件夹中创建了额外的.htaccess,用于排除到达那里的流量。

1 个答案:

答案 0 :(得分:0)

admin.domain.com - 500错误

您的管理员重写过于宽泛,无法循环播放。

RewriteCond %{HTTP_HOST} ^admin\. [NC]
RewriteRule ^(.*)$ /admin/$1 [L]

尝试添加条件RewriteCond %{REQUEST_URI} !^/admin [NC]以避免循环(如果真实的请求以/admin开头,它将永远不会匹配。

RewriteCond %{HTTP_HOST} ^admin\. [NC]
RewriteCond %{REQUEST_URI} !^/admin [NC]
RewriteRule ^(.*)$ /admin/$1 [L]

的favicon.ico

RedirectMatchRedirect指令都有两个必需参数:正则表达式/路径和重定向URL。状态代码是可选的。从理论上讲,您的规则RedirectMatch 404 favicon.ico可能会被解释为“如果路径匹配404然后重定向到favicon.ico”。我建议在指令ala:Redirect 404 /favicon.ico /dev/null中添加一个虚拟URL(不存在)。